如何重建本地行动

时间:2017-12-08 16:52:09

标签: drupal drupal-8

我想在页面中添加一个操作(让我们说路线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')];)。

谢谢

1 个答案:

答案 0 :(得分:0)

通过查看控制台命令drupal cache:reset,我找到了行

$bins = Cache::getBins();
$bins['render']->deleteAll();
$bins['discovery']->deleteAll();

重置每个请求的本地操作。 所以我现在有了答案。

希望这会有所帮助!