Hook_init () все еще используется? Если он больше не используется, как мне преобразовать код, реализующий hook_init ()?

10

Глядя на API Drupal.org, я заметил, что hook_init () не документирован для Drupal 8. Просматривая записи изменений, я обнаружил, что перехватчиков Bootstrap больше не существует , что указывает на избавление от всех перехватчиков «bootstrap» , где перехватывает bootstrap Говорят, что hook_boot()и hook_exit(); ничего не сказано о hook_init().

Я искал hook_init в источнике Drupal 8, и я нашел следующий код. Первый - это ссылка на hook_init()комментарий; другие два кажутся 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

Затем вы реализуете EventSubscriberInterface(новый файл в src/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();   
  ...
}
Майкл Бопп
источник
Как использовать ['#attached] [' js] в функции initializeMyModule? Так как в функции нет $ var, $ page или другого аргумента.
Неха,
@neha - нет. Этот ответ справляется с тем, как заменить hook 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-beta3, смотрите запись изменений ), что также полезно для этого в 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);

Если вам нужно выполнить более сложное прослушивание запроса / ответа, вы можете определить прослушиватель событий ядра в стиле Drupal 8, как описано в удаленном hook_init () .

Дэвид Томас
источник
4
Вы никогда не должны использовать drupal_add_js / drupal_add_css - даже в Drupal 7 их лучше избегать - лучше использовать #attached. Я удалил эту часть.
1
@chx, drupal_process_attachedтакже использует drupal_add_css / js для добавления реквизитов страницы вcall_user_func('drupal_add_' . $type, $data, $options);
Дэвид Томас
1
Да, но drupal_process_attachedсрабатывает после получения кэша рендеринга. Если вы это сделаете, #attachedваш CSS / JS будет добавлен, даже если используется кэш рендеринга.
2
Похоже, что hook_page_build больше не вещь в D8?
цифрофер
4

hook_page_build () устарела в пользу записи изменений hook_page_attachments () здесь .

Пример:

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

имя_библиотеки - это имя библиотеки, определенное в mymodule.libraries.yml вашего модуля

pferlito
источник