我想在页面中添加一个操作(让我们说路线entity.node.canonical
),但此操作会不时出现在页面上。
所以我尝试做的是使用派生程序创建动作(我将条件显示在方法getDerivativeDefinitions
中),然后在内核事件中刷新使用\Drupal::service('plugin.manager.menu.local_action')->clearCachedDefinitions();
但它仍然无效!
那么有人能够向我展示一种显示和隐藏动作的方法吗?
这是我的衍生物:
class ConditionnalAction extends DeriverBase implements ContainerDeriverInterface {
/**
* {@inheritdoc}
*/
public function getDerivativeDefinitions($base_plugin_definition)
{
// If the seconds is more than 30, hide the action.
if (date('s') > 30) {
return $this->derivatives;
}
// Else, show the action.
$menu_entry = $base_plugin_definition;
$menu_entry['route_name'] = 'my.route.name';
$menu_entry['title'] = 'Test action';
$menu_entry['appears_on'][] = \Drupal::routeMatch()->getRouteName();
$menu_entry['route_parameters'] = ['time' => date('s')];
$this->derivatives['my.action.name'] = $menu_entry;
return $this->derivatives;
}
}
以下是活动订阅者:
class MyModuleKernelSubscriber implements EventSubscriberInterface {
/**
* {@inheritdoc}
*/
public static function getSubscribedEvents() {
return [
KernelEvents::REQUEST => 'onKernelRequest'
];
}
/**
* Event called when a request is sent.
*
* @param \Symfony\Component\HttpKernel\Event\GetResponseEvent $event
*/
public function onKernelRequest(GetResponseEvent $event) {
// Do not consider the ajax requests.
$request = $event->getRequest();
if ($request->isXmlHttpRequest() === TRUE) {
return;
}
// Flush local action cache.
\Drupal::service('plugin.manager.menu.local_action')->clearCachedDefinitions();
}
}
所以,在这里,在每个请求中,应该清除本地操作,代码应该通过我的派生。但它不起作用......有什么想法吗?
我真的需要它才能成为一个动作!我真的需要URL参数也是动态的(这里是$menu_entry['route_parameters'] = ['time' => date('s')];
)。
谢谢
答案 0 :(得分:0)
通过查看控制台命令drupal cache:reset
,我找到了行
$bins = Cache::getBins();
$bins['render']->deleteAll();
$bins['discovery']->deleteAll();
重置每个请求的本地操作。 所以我现在有了答案。
希望这会有所帮助!