Wird hook_init () noch verwendet? Wie konvertiere ich Code, der hook_init () implementiert, wenn er nicht mehr verwendet wird?

10

Beim Betrachten der Drupal.org-API habe ich festgestellt, dass hook_init () für Drupal 8 nicht dokumentiert ist. Als ich die Änderungsdatensätze betrachtete, stellte ich fest , dass keine Bootstrap-Hooks mehr vorhanden sind , was darauf hinweist, dass alle Bootstrap-Hooks entfernt werden , an denen sich die Bootstrap-Hooks befinden sollen sein hook_boot()und hook_exit(); es wird nichts darüber gesagt hook_init().

Ich habe in der Drupal 8-Quelle nach hook_init gesucht und den folgenden Code gefunden. Der erste ist ein Verweis auf hook_init()einen Kommentar; Die anderen beiden scheinen eine hook_init()Implementierung zu sein, aber beide erhalten einen Parameter, den ich nicht erwarte.

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

Ich habe auch nach einer Funktion gesucht, die aufgerufen wurde, hook_init()aber keine gefunden.

Wird hook_init()noch in Drupal 8 verwendet? Wie konvertiere ich die Implementierung von Drupal 7-Code, wenn es nicht mehr verwendet wird hook_init()?

kiamlaluno
quelle

Antworten:

6

Vielleicht hat sich dies geändert, seit diese Frage zuletzt beantwortet wurde. Ich denke jedoch, dass der bevorzugte Ansatz zum Ersetzen der Vorgänge darin hook_initbesteht, einen Ereignisabonnenten zu erstellen und die 'Anfrage' zu ergänzen. Hier erfahren Sie, wie Sie dies für diejenigen tun, die es möglicherweise nützlich finden.

Beispiel services.yml

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

Dann würden Sie die EventSubscriberInterface(neue Datei im src/EventSubscriberVerzeichnis) implementieren und in der implementierten Methode getSubscribedEventskönnen Sie so etwas wie ...

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

Und fügen Sie die Methode entsprechend hinzu

/**
 * MyModule
 *
 * @param \Symfony\Component\HttpKernel\Event\GetResponseEvent $event
 *   The event to process.
 */
public function initializeMyModule(GetResponseEvent $event) {
  $request = $event->getRequest();   
  ...
}
Michael Bopp
quelle
Wie verwende ich ['#attached] [' js] in der Funktion initializeMyModule? Da die Funktion kein $ var, $ page oder ein anderes Argument enthält.
Neha
@neha - Das tust du nicht. Diese Antwort beschreibt, wie Hook-Init durch fortgeschrittenere Dinge ersetzt werden kann. Aber zum Anhängen von Bibliotheken verwenden Sie hook_page_attachmentsoder hook_page_attachments_alter.
Leymannx
5

Ja, hook_init()wird in Drupal 8 nicht verwendet Wenn Sie drupal_add_js()oder drupal_add_css()Sie verwenden können , hook_page_build()statt ( Anmerkung : dieser Haken in Drupal 8.0.0-beta3 siehe entfernt Änderungsdatensatz ), die für den in Drupal 7 ist auch nützlich.

Beispielsweise können CSS-Stile und JavaScript-Code zur hook_page_build()Verwendung hinzugefügt werden $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);

Wenn Sie die Anforderung / Antwort dort komplexer abhören müssen , können Sie einen Kernel-Ereignis-Listener im Drupal 8-Stil definieren, wie in hook_init () dokumentiert dokumentiert .

David Thomas
quelle
4
Sie sollten niemals drupal_add_js / drupal_add_css verwenden - selbst in Drupal 7 werden sie besser vermieden - verwenden Sie besser #attached. Ich habe diesen Teil entfernt.
1
@chx, drupal_process_attachedverwendet auch drupal_add_css / js, um die Seitenanforderungen in hinzuzufügencall_user_func('drupal_add_' . $type, $data, $options);
David Thomas
1
Ja, wird jedoch drupal_process_attachedausgelöst, nachdem der Render-Cache abgerufen wurde. Wenn Sie dies tun, #attachedwird Ihr CSS / JS hinzugefügt, auch wenn der Render-Cache verwendet wird.
2
Scheint, dass hook_page_build in D8 keine Sache mehr ist?
Digitgopher
4

hook_page_build () wurde für veraltet hook_page_attachments () Akte wechseln hier .

Beispiel:

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

Bibliotheksname ist der Name der Bibliothek, der in der Datei mymodule.libraries.yml Ihres Moduls definiert ist

pferlito
quelle