Apakah hook_init () masih digunakan? Jika tidak lagi digunakan, bagaimana cara mengkonversi kode yang mengimplementasikan hook_init ()?

10

Melihat di Drupal.org API, saya perhatikan bahwa hook_init () tidak didokumentasikan untuk Drupal 8. Melihat catatan perubahan, saya menemukan kait Bootstrap tidak ada lagi , yang menunjuk ke Singkirkan semua kait 'bootstrap' , di mana kait bootstrap dikatakan hook_boot()dan hook_exit(); tidak ada yang dikatakan tentang hook_init().

Saya mencari hook_init di sumber Drupal 8, dan saya menemukan kode berikut. Yang pertama adalah referensi untuk hook_init()dibuat dalam komentar; dua lainnya tampak hook_init()implementasi, tetapi mereka berdua mendapatkan parameter yang tidak saya harapkan.

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;
  }
}

Saya juga mencari fungsi yang memohon hook_init()tetapi saya tidak menemukannya.

Apakah hook_init()masih digunakan di Drupal 8? Jika tidak lagi digunakan, bagaimana cara mengkonversi penerapan kode Drupal 7 hook_init()?

kiamlaluno
sumber

Jawaban:

6

Mungkin ini telah berubah sejak pertanyaan ini dijawab terakhir. Tapi saya pikir pendekatan yang lebih disukai untuk mengganti apa yang sedang terjadi hook_initadalah membuat pelanggan acara, dan menambahkan ke 'permintaan'. Inilah cara Anda melakukannya bagi mereka yang mungkin merasa bermanfaat.

Contoh services.yml

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

Kemudian Anda akan mengimplementasikan EventSubscriberInterface(file baru di src/EventSubscriberdirektori) dan dalam metode yang diterapkan getSubscribedEventsAnda dapat melakukan sesuatu seperti ...

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

Dan tambahkan metode yang sesuai

/**
 * MyModule
 *
 * @param \Symfony\Component\HttpKernel\Event\GetResponseEvent $event
 *   The event to process.
 */
public function initializeMyModule(GetResponseEvent $event) {
  $request = $event->getRequest();   
  ...
}
Michael Bopp
sumber
Bagaimana cara menggunakan ['#attached] [' js] dalam fungsi initializeMyModule? Karena tidak ada $ var, $ page atau argumen apa pun dalam fungsinya.
neha
@neha - Kamu tidak. Jawaban ini sesuai dengan cara mengganti hook init untuk hal-hal yang lebih maju. Tetapi untuk melampirkan perpustakaan Anda menggunakan hook_page_attachmentsatau hook_page_attachments_alter.
leymannx
5

Ya, hook_init()tidak digunakan dalam Drupal 8. Jika Anda membutuhkan drupal_add_js()atau drupal_add_css()Anda dapat menggunakan hook_page_build()sebagai gantinya ( catatan : kait ini telah dihapus di Drupal 8.0.0-beta3 lihat catatan perubahan ), yang juga berguna untuk itu di Drupal 7.

Misalnya, gaya CSS dan kode JavaScript dapat ditambahkan untuk hook_page_build()digunakan $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);

Jika Anda perlu mendengarkan lebih kompleks berdasarkan permintaan / tanggapan di sana, Anda dapat menentukan pendengar acara kernel gaya Drupal 8 yang didokumentasikan pada hook_init () dihapus .

David Thomas
sumber
4
Anda seharusnya tidak pernah menggunakan drupal_add_js / drupal_add_css - bahkan di Drupal 7 mereka lebih baik dihindari - lebih baik menggunakan #attached. Saya menghapus bagian ini.
1
@ chx, drupal_process_attachedjuga menggunakan drupal_add_css / js untuk menambahkan syarat halamancall_user_func('drupal_add_' . $type, $data, $options);
David Thomas
1
Ya tetapi drupal_process_attachedmenyala setelah cache render diambil. Jika Anda melakukannya, #attachedCSS / JS Anda akan ditambahkan bahkan ketika cache render digunakan.
2
Muncul hook_page_build bukan hal di D8 lagi?
digitgopher
4

hook_page_build () telah tidak digunakan lagi karena hook_page_attachments () ubah catatan di sini .

Contoh:

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

libraryname adalah nama perpustakaan, didefinisikan dalam mymodule.libraries.yml modul Anda

pferlito
sumber