是否仍使用hook_init()?如果不再使用,如何转换实现hook_init()的代码?


10

在Drupal.org API上,我注意到Drupal 8没有记录hook_init()。在更改记录中,我发现Bootstrap钩子不再存在,它指向摆脱所有'bootstrap'钩子,而Bootstrap钩子在这里据说是hook_boot()hook_exit(); 什么也没说hook_init()

我在Drupal 8源代码中搜索hook_init,发现以下代码。第一个是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()

Answers:


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();   
  ...
}

如何在函数initializeMyModule中使用['#attached] ['js]?因为函数中没有$ var,$ page或其他参数。
neha

@neha –你不知道。这个答案解决了如何用钩子init替换更高级的东西。但是对于附加库,您可以使用hook_page_attachmentshook_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()using中$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()removeed所述


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);
David Thomas

1
是,但是检索渲染缓存后将drupal_process_attached触发。如果这样做,那么即使使用渲染缓存,也会添加CSS / JS。#attached

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中定义

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.