Le hook_init () est-il toujours utilisé? S'il n'est plus utilisé, comment convertir le code implémentant hook_init ()?

10

En regardant sur l'API Drupal.org, j'ai remarqué que hook_init () n'est pas documenté pour Drupal 8. En regardant les enregistrements de changement, j'ai trouvé que les crochets Bootstrap n'existent plus , ce qui indique de se débarrasser de tous les crochets «bootstrap» , où les crochets bootstrap sont censés être hook_boot()et hook_exit(); rien n'est dit hook_init().

J'ai recherché hook_init dans la source Drupal 8, et j'ai trouvé le code suivant. Le premier est une référence à hook_init()faite dans un commentaire; les deux autres semblent une hook_init()implémentation, mais ils obtiennent tous les deux un paramètre que je n'attends pas.

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

J'ai également cherché une fonction invoquée hook_init()mais je n'en ai pas trouvé.

Est hook_init()toujours utilisé dans Drupal 8? S'il n'est plus utilisé, comment convertir l'implémentation du code Drupal 7 hook_init()?

kiamlaluno
la source

Réponses:

6

Peut-être que cela a changé depuis la dernière réponse à cette question. Mais je pense que l'approche préférée pour remplacer ce qui se passe hook_initest de créer un abonné à l'événement et d'ajouter à la «demande». Voici comment vous faites cela pour ceux qui pourraient le trouver utile.

Exemple services.yml

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

Ensuite, vous implémenteriez le EventSubscriberInterface(nouveau fichier dans le src/EventSubscriberrépertoire) et dans la méthode implémentée, getSubscribedEventsvous pouvez faire quelque chose comme ...

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

Et ajoutez la méthode en conséquence

/**
 * MyModule
 *
 * @param \Symfony\Component\HttpKernel\Event\GetResponseEvent $event
 *   The event to process.
 */
public function initializeMyModule(GetResponseEvent $event) {
  $request = $event->getRequest();   
  ...
}
Michael Bopp
la source
Comment utiliser ['#attached] [' js] dans la fonction initializeMyModule? Puisqu'il n'y a pas $ var, $ page ou autre argument dans la fonction.
neha
@neha - Non. Cette réponse permet de remplacer le crochet init pour des choses plus avancées. Mais pour attacher des bibliothèques que vous utilisez hook_page_attachmentsou hook_page_attachments_alter.
leymannx
5

Oui, hook_init()n'est pas utilisé dans Drupal 8. Si vous en avez besoin drupal_add_js()ou que drupal_add_css()vous pouvez utiliser à la hook_page_build()place ( remarque : ce crochet a été supprimé dans Drupal 8.0.0-beta3, voir l' enregistrement des modifications ), ce qui est également utile pour cela dans Drupal 7.

Par exemple, des styles CSS et du code JavaScript peuvent être ajoutés à l' hook_page_build()utilisation $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 vous avez besoin de faire une écoute plus complexe sur la demande / réponse, vous pouvez définir un écouteur d'événement de noyau de style Drupal 8 comme indiqué sur hook_init () supprimé .

David Thomas
la source
4
Vous ne devriez jamais utiliser drupal_add_js / drupal_add_css - même dans Drupal 7, il vaut mieux les éviter - mieux utiliser #attached. J'ai supprimé cette partie.
1
@chx, drupal_process_attachedutilise également drupal_add_css / js pour ajouter les éléments requis pour la page danscall_user_func('drupal_add_' . $type, $data, $options);
David Thomas
1
Oui, mais se drupal_process_attacheddéclenche après la récupération du cache de rendu. Si vous le faites, #attachedvotre CSS / JS sera ajouté même lorsque le cache de rendu est utilisé.
2
Apparaît que hook_page_build n'est plus rien dans D8?
digitgopher
4

hook_page_build () est déconseillé au profit de hook_page_attachments () change record ici .

Exemple:

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

nom_bibliothèques est le nom de la bibliothèque, défini dans le module mymodule.libraries.yml de votre module

pferlito
la source