Рейтинг:0

Не устанавливать кеш при создании динамического локального действия через производные

флаг vn

Я пытаюсь создать динамическое локальное действие через производную. Производная работает и возвращает ссылку, сгенерированную динамически, но кеш, похоже, сохраняет свое значение.

Согласно этому Журнал изменений ядра Drupal, я понял, что могу установить параметры кеша для производной, что я пытался, но пока тщетно - я еще не очень хорошо знаком с этими концепциями, поэтому ценю любые рекомендации о том, как предотвратить $гид от кэширования.

Вот мое локальное действие ведет.ссылки.action.yml:

ведет.new_deal:
  производный: 'Drupal\leads\Plugin\Derivative\DynamicLocalTasks'

Вот моя производная:

<?php

пространство имен Drupal\leads\Plugin\Derivative;

используйте Drupal\Component\Plugin\Derivative\DeriverBase;
используйте Drupal\Core\Cache\CacheableDependencyInterface;
используйте Drupal\Core\Cache\CacheableDependencyTrait;


/**
* Определяет динамические локальные задачи.
*/
класс DynamicLocalTasks расширяет DeriverBase {
  использовать CacheableDependencyTrait;
  /**
  * {@inheritdoc}
  */
  публичная функция getDerivativeDefinitions($base_plugin_definition) {
    $groupLead = getGroupsUserIsLead();

    если (isset($groupLead[0])){
      $gid = $groupLead[0];
    }
    еще{
      return \Drupal\Core\Access\AccessResult::forbidden();
    }

    // Реализовать динамическую логику для предоставления значений для тех же ключей, что и в example.links.task.yml.
    $this->derivatives['leads.new_deal'] = $base_plugin_definition;
    $this->derivatives['leads.new_deal']['title'] = "Новый курс";
    $this->derivatives['leads.new_deal']['route_name'] = 'entity.group_content.create_form';
    $this->derivatives['leads.new_deal']['appears_on'] = ['leads.deals'];
    $this->derivatives['leads.new_deal']['route_parameters'] = ['plugin_id' => 'group_node:deals','group' => $gid];
    $this->cacheMaxAge = 0;
    $this->getCacheMaxAge();
    
    вернуть parent::getDerivativeDefinitions($base_plugin_definition);
  }

  общедоступная функция getCacheMaxAge() {
    вернуть 0;
  }

}
Рейтинг:2
флаг cn

Добавление CacheableDependencyTrait в производный объект не делает его полностью кэшируемым. В Drupal нет кода, проверяющего наличие кешируемых зависимостей дериверов в обычном запросе. Вы должны вернуть заголовок, имя маршрута и т. д. из плагина локальной задачи, где вы также можете использовать методы getCache*(). Видеть https://drupal.stackexchange.com/a/273293/47547

Рейтинг:1
флаг vn

Как предложил @4uk4, вот что я сделал:

ведет.new_deal:
  route_name: entity.group_content.create_form
  Название: 'Новый курс'
  параметры_маршрута:
    plugin_id: group_node:сделки
    группа: 0
  класс: 'Drupal\leads\Plugin\Menu\DynamicLocalTasks'
  появляется_на:
    - 'ведет.сделки'
<?php

пространство имен Drupal\leads\Plugin\Menu;

используйте Drupal\Core\Menu\LocalActionDefault;
используйте Drupal\Core\Routing\RouteMatchInterface;

класс DynamicLocalTasks расширяет LocalActionDefault {
  общедоступная функция getRouteParameters (RouteMatchInterface $ route_match) {
    $groupLead = getGroupsUserIsLead();

    $gid = $groupLead[0] ?? НОЛЬ;

    возвращаться [
      'plugin_id' => 'group_node:сделки',
      'группа' => $гид,
    ]; 
  }
}
флаг vn
Стоит отметить, что мне не нужно было менять поведение кэша с помощью этого метода.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.