¿Se sigue utilizando hook_init ()? Si ya no se usa, ¿cómo convierto el código implementando hook_init ()?


10

Al mirar la API de Drupal.org, noté que hook_init () no está documentado para Drupal 8. Al mirar los registros de cambios, encontré que los ganchos Bootstrap ya no existen , lo que apunta a Deshacerse de todos los ganchos 'bootstrap' , donde los ganchos bootstrap se dice que son hook_boot()y hook_exit(); nada se dice acerca hook_init().

Busqué hook_init en la fuente Drupal 8, y encontré el siguiente código. El primero es una referencia hook_init()hecha en un comentario; los otros dos parecen una hook_init()implementación, pero ambos obtienen un parámetro que no espero.

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

También busqué cualquier función que invocara hook_init()pero no encontré ninguna.

¿ hook_init()Todavía se usa en Drupal 8? Si ya no se usa, ¿cómo convierto la implementación del código Drupal 7 hook_init()?

Respuestas:


6

Quizás esto ha cambiado desde que esta pregunta fue respondida por última vez. Pero creo que el enfoque preferido para reemplazar lo que está sucediendo hook_inites crear un suscriptor de eventos y agregar a la 'solicitud'. Así es como lo haces para aquellos que puedan encontrarlo útil.

Ejemplo services.yml

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

Luego implementaría el EventSubscriberInterface(nuevo archivo en el src/EventSubscriberdirectorio) y en el método implementado getSubscribedEventspuede hacer algo como ...

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

Y agregue el método en consecuencia

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

¿Cómo usar ['#attached] [' js] en la función initializeMyModule? Como no hay $ var, $ page o algún otro argumento en la función.
neha

@neha: no lo haces. Esta respuesta trata sobre cómo reemplazar hook init por cosas más avanzadas. Pero para adjuntar bibliotecas usa hook_page_attachmentso hook_page_attachments_alter.
leymannx

5

Sí, hook_init()no se usa en Drupal 8. Si lo necesita drupal_add_js()o drupal_add_css()puede usarlo hook_page_build()en su lugar ( nota : este gancho se eliminó en Drupal 8.0.0-beta3 ver el registro de cambios ), que también es útil para eso en Drupal 7.

Por ejemplo, los estilos CSS y el código JavaScript se pueden agregar al hook_page_build()uso $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);

Si necesita hacer una escucha más compleja en la solicitud / respuesta allí, puede definir un detector de eventos de kernel de estilo Drupal 8 como se documenta en hook_init () eliminado .


44
Nunca debe usar drupal_add_js / drupal_add_css - incluso en Drupal 7 es mejor evitarlos - mejor use #attached. Quité esta parte.

1
@chx, drupal_process_attachedtambién usa drupal_add_css / js para agregar los requisitos de la página encall_user_func('drupal_add_' . $type, $data, $options);
David Thomas

1
Sí, pero se drupal_process_attacheddispara después de recuperar el caché de renderizado. Si lo hace #attached, su CSS / JS se agregará incluso cuando se use el caché de renderizado.

2
Parece que hook_page_build ya no es una cosa en D8?
digitgopher

4

hook_page_build () ha quedado en desuso en favor del registro de cambios hook_page_attachments () aquí .

Ejemplo:

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

nombre de biblioteca es el nombre de la biblioteca, definido en mymodule.libraries.yml de su módulo

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.