web-dev-qa-db-ja.com

hook_node_accessの前にKernelEvents :: REQUESTイベントを実行しますか?

私はリクエストに対していくつかの静的な変数設定を行っており、KernelEvents::REQUESTを使用して最初に実行して変数を設定することを望んでいました。

ただし、ドキュメントには次のように記載されていますが、

REQUESTイベントは、リクエストのディスパッチの最初に発生します。

hook_node_accessは実際にはKernelEvents::REQUESTイベントハンドラの前に実行されます。

  /**
   * The subscribed events.
   */
  public static function getSubscribedEvents() {
    $events = [];
    $events[KernelEvents::REQUEST][] = ['onKernelRequest', 1];
    return $events;
  }

次に、イベントリスナーで:

  public function onKernelRequest(GetResponseEvent $event) {
    drupal_set_message(__FUNCTION__ . ': ' . microtime());
  }

hook_node_access

次に、イベントリスナーで:

  public function mymodule_node_accesss(NodeInterface $node, $op, AccountInterface $account) {
    drupal_set_message(__FUNCTION__ . ': ' . microtime());
  }

出力:

mymodule_node_access: 0.76379200 1518995630
onKernelRequest: 0.77758400 1518995630

マイクロタイムの順序からわかるように、hook_node_accessが最初に実行されます。とにかく、それをKernelEvents::REQUESTイベントハンドラーの後に実行させるには?ありがとう。

2
David Thomas

OK、少し掘り下げた後、私は解決策を見つけました。

['onKernelRequest', 1]の「重み」パラメーターはソートDESCであるため、重みの大きい数値が最初に実行されます。

ウェイト1000を使用してイベントリスナーを次のように調整すると、hook_node_accessを呼び出すリスナーの前に実行されます

  /**
   * The subscribed events.
   */
  public static function getSubscribedEvents() {
    $events = [];
    $events[KernelEvents::REQUEST][] = ['onKernelRequest', 1000];
    return $events;
  }
3
David Thomas