hook_init()はまだ使用されていますか?使用されなくなった場合、hook_init()を実装するコードをどのように変換しますか?


10

Drupal.orgのAPIに見ると、私はそれに気づいhook_init()が変更レコードを見るとDrupalの8のために文書化されていない、私が見つかりました。ブートストラップは、もはや存在しフックしないためのポイント、すべての「ブートストラップ」のフックを取り除く、ブートストラップフックをであると言われているhook_boot()hook_exit()、何も言われていませんhook_init()

Drupal 8のソースでhook_initを検索したところ、次のコードが見つかりました。1つ目はhook_init()、コメントへの参照です。他の2つはhook_init()実装のように見えますが、どちらも私が予期していないパラメーターを受け取ります。

function overlay_enable() {
  if (strpos(current_path(), 'admin/modules') === 0) {
    // Flag for a redirect to <front>#overlay=admin/modules on hook_init().
    $_SESSION['overlay_enable_redirect'] = 1;
  }
}
/**
 * Implements hook_init().
 */
function phptemplate_init($template) {
  $file = dirname($template->filename) . '/' . $template->name . '.theme';
  if (file_exists($file)) {
    include_once DRUPAL_ROOT . '/' . $file;
  }
}
/**
 * Implements hook_init().
 */
function twig_init($template) {
  $file = dirname($template->filename) . '/' . $template->name . '.theme';
  if (file_exists($file)) {
    include_once DRUPAL_ROOT . '/' . $file;
  }
}

また、呼び出す関数を探しましたが、hook_init()見つかりませんでした。

hook_init()Drupal 8 ではまだ使用されていますか?使用されなくなった場合、Drupal 7コードの実装を変換するにはどうすればよいhook_init()ですか?

回答:


6

おそらく、この質問が最後に回答されてから、これは変わったのでしょう。しかし、私は起こっていることを置き換えるための好ましいアプローチhook_initは、イベントサブスクライバーを作成し、「リクエスト」に追加することだと思います。ここでは、それが役立つと思われる人のために、その方法を説明します。

services.ymlの例

services:
  init_subscriber:
    class:   Drupal\mymodule\EventSubscriber\MyModuleSubscriber
    arguments: ['@current_user'] // <- optional args
    tags:
      - {name: event_subscriber} // <- Required Tag

次に、EventSubscriberInterfacesrc/EventSubscriberディレクトリ内の新しいファイル)を実装し、実装されたメソッドでgetSubscribedEvents次のようなことができます...

/**
 * {@inheritdoc}
 */
public static function getSubscribedEvents() {
  $events[KernelEvents::REQUEST][] = array('initializeMyModule');
  return $events;
}

そしてそれに応じてメソッドを追加します

/**
 * MyModule
 *
 * @param \Symfony\Component\HttpKernel\Event\GetResponseEvent $event
 *   The event to process.
 */
public function initializeMyModule(GetResponseEvent $event) {
  $request = $event->getRequest();   
  ...
}

関数initializeMyModuleで['#attached] [' js]を使用するには?関数には$ var、$ page、またはその他の引数がないためです。
neha

@neha –そうではありません。この回答は、フックのinitをより高度なものに置き換える方法に対処しています。ただし、ライブラリをアタッチする場合は、hook_page_attachmentsまたはを使用しますhook_page_attachments_alter
leymannx

5

はい、hook_init()あなたが必要な場合はDrupal 8で使用されていないdrupal_add_js()か、drupal_add_css()あなたが使用できるhook_page_build()代わりに、(ノートを:このフックは、Drupalの8.0.0-ベータ3の参照を除去した変更レコード)も、Drupalの7のそれのために有用です。

たとえば、CSSスタイルとJavaScriptコードをhook_page_build()を使用して追加できます$page['#attached']

 $path = drupal_get_path('module', 'MY_MODULE');
 $page['#attached']['js'][$path . '/my_module.js'] = array('scope' => 'footer');
 $page['#attached']['css'][$path . '/my_module.base.css'] = array('every_page' => TRUE);

そこでリクエスト/レスポンスをより複雑にリッスンする必要がある場合は、Dookal 8スタイルのカーネルイベントリスナーを、hook_init()の削除に記載されているように定義できます。


4
drupal_add_js / drupal_add_cssは絶対に使用しないでください。Drupal7でも、回避する必要があります。#attachedを使用することをお勧めします。この部分を外しました。

1
@chx drupal_process_attachedもdrupal_add_css / jsを使用して、必須ページを追加しますcall_user_func('drupal_add_' . $type, $data, $options);
David Thomas

1
はい。ただし、レンダーキャッシュが取得されたdrupal_process_attached発生ます。そうした場合#attached、あなたのCSSを/ JSは、レンダリングキャッシュを使用する場合であっても追加されます。

2
hook_page_buildがD8のものではなくなったように見えますか?
digitgopher

4

hook_page_build()は非推奨になり、hook_page_attachments()変更レコードがここ追加されまし

例:

function MYMODULE_page_attachments(array &$attachments) {
  $attachments ['#attached']['library'][] = 'modulename/libraryname';
}

librarynameは、モジュールのmymodule.libraries.ymlで定義されたライブラリの名前です

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.