Hook_init () è ancora usato? Se non viene più utilizzato, come posso convertire il codice implementando hook_init ()?


10

Guardando l'API di Drupal.org, ho notato che hook_init () non è documentato per Drupal 8. Osservando i record di modifica, ho scoperto che gli hook di Bootstrap non esistono più , il che indica come sbarazzarsi di tutti gli hook di "bootstrap" , dove gli hook di bootstrap si dice che siano hook_boot()e hook_exit(); non si dice nulla hook_init().

Ho cercato hook_init nel sorgente Drupal 8 e ho trovato il seguente codice. Il primo è un riferimento da hook_init()fare in un commento; gli altri due sembrano hook_init()un'implementazione, ma entrambi ottengono un parametro che non mi aspetto.

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

Ho anche cercato qualsiasi funzione che invoca hook_init()ma non ne ho trovata nessuna.

È hook_init()ancora usato in Drupal 8? Se non viene più utilizzato, come faccio a convertire l'implementazione del codice Drupal 7 hook_init()?

Risposte:


6

Forse questo è cambiato dall'ultima risposta a questa domanda. Ma penso che l'approccio preferito per sostituire ciò che sta succedendo hook_initè quello di creare un abbonato di eventi e aggiungerlo alla "richiesta". Ecco come lo fai per coloro che potrebbero trovarlo utile.

Esempio services.yml

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

Quindi implementerai il EventSubscriberInterface(nuovo file nella src/EventSubscriberdirectory) e nel metodo implementato getSubscribedEventspuoi fare qualcosa come ...

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

E aggiungi il metodo di conseguenza

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

Come usare ['#attached] [' js] nella funzione initializeMyModule? Siccome non c'è $ var, $ page o qualcos'altro argomento nella funzione.
Neha,

@neha - No. Questa risposta spiega come sostituire hook init per cose più avanzate. Ma per allegare librerie che usi hook_page_attachmentso hook_page_attachments_alter.
leymannx,

5

Sì, hook_init()non è usato in Drupal 8. Se ne hai bisogno drupal_add_js()o drupal_add_css()puoi hook_page_build()invece usarlo ( nota : questo hook è stato rimosso in Drupal 8.0.0-beta3 vedi record di modifica ), che è utile anche per quello in Drupal 7.

Ad esempio, gli stili CSS e il codice JavaScript possono essere aggiunti hook_page_build()all'utilizzo $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);

Se è necessario eseguire un ascolto più complesso sulla richiesta / risposta lì, è possibile definire un listener di eventi del kernel in stile Drupal 8 come documentato su hook_init () rimosso .


4
Non dovresti mai usare drupal_add_js / drupal_add_css - anche in Drupal 7 sono meglio evitati - meglio usare #attached. Ho rimosso questa parte.

1
@chx, drupal_process_attachedusa anche drupal_add_css / js per aggiungere i requisiti di pagina incall_user_func('drupal_add_' . $type, $data, $options);
David Thomas

1
Sì, ma si drupal_process_attachedattiva dopo il recupero della cache di rendering. Se lo fai, #attachedCSS / JS verranno aggiunti anche quando viene utilizzata la cache di rendering.

2
Sembra che hook_page_build non sia più una cosa in D8?
digitgopher

4

hook_page_build () è stato deprecato a favore del record di modifica hook_page_attachments () qui .

Esempio:

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

nome libreria è il nome della libreria, definito in mymodule.libraries.yml del modulo

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.