Czy hook_init () jest nadal używany? Jeśli nie jest już używany, jak przekonwertować kod implementujący hook_init ()?

10

Patrząc na API Drupal.org, zauważyłem, że hook_init () nie jest udokumentowany dla Drupala 8. Patrząc na rekordy zmian, zauważyłem, że haki Bootstrap już nie istnieją , co wskazuje na Pozbycie się wszystkich haków „bootstrap” , w których haki bootstrap są uważane za hook_boot()i hook_exit(); nic nie jest powiedziane hook_init().

Szukałem hook_init w źródle Drupala 8 i znalazłem następujący kod. Pierwszy to odniesienie do hook_init()komentarza; pozostałe dwa wydają się hook_init()implementacją, ale oba otrzymują parametr, którego nie oczekuję.

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

Szukałem również wywoływania dowolnej funkcji, hook_init()ale nie znalazłem żadnej.

Jest hook_init()nadal używany w Drupal 8? Jeśli nie jest już używany, jak przekonwertować implementację kodu Drupal 7 hook_init()?

kiamlaluno
źródło

Odpowiedzi:

6

Być może zmieniło się to od ostatniej odpowiedzi na to pytanie. Myślę jednak, że preferowanym podejściem do zastąpienia tego, co się dzieje, hook_initjest utworzenie subskrybenta zdarzenia i dodanie do „żądania”. Oto jak to zrobić dla tych, którzy mogą uznać to za przydatne.

Przykładowe services.yml

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

Następnie zaimplementowałbyś EventSubscriberInterface(nowy plik w src/EventSubscriberkatalogu), a zaimplementowaną metodą getSubscribedEventsmożesz zrobić coś takiego ...

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

I odpowiednio dodaj metodę

/**
 * MyModule
 *
 * @param \Symfony\Component\HttpKernel\Event\GetResponseEvent $event
 *   The event to process.
 */
public function initializeMyModule(GetResponseEvent $event) {
  $request = $event->getRequest();   
  ...
}
Michael Bopp
źródło
Jak używać ['#attached] [' js] w funkcji initializeMyModule? Gdy funkcja nie zawiera $ var, $ page ani innego argumentu.
neha
@neha - Ty nie. Ta odpowiedź radzi sobie z tym, jak zastąpić hook hook na bardziej zaawansowane rzeczy. Ale do dołączania bibliotek używasz hook_page_attachmentslub hook_page_attachments_alter.
leymannx,
5

Tak, hook_init()nie jest używany w Drupal 8. Jeśli potrzebujesz drupal_add_js()lub drupal_add_css()możesz użyć hook_page_build()zamiast tego ( uwaga : ten hak został usunięty w Drupal 8.0.0-beta3 zobacz zmianę zapisu ), co jest również przydatne w tym przypadku w Drupal 7.

Na przykład, style CSS oraz kodu JavaScript można dodawać do hook_page_build()korzystania $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);

Jeśli potrzebujesz bardziej złożonego nasłuchiwania na żądanie / odpowiedź, możesz zdefiniować detektor zdarzeń jądra Drupal 8 zgodnie z dokumentacją usuniętego hook_init () .

David Thomas
źródło
4
Nigdy nie powinieneś używać drupal_add_js / drupal_add_css - nawet w Drupal 7 lepiej ich unikać - lepiej użyć # attached. Usunąłem tę część.
1
@chx, drupal_process_attachedużywa także drupal_add_css / js, aby dodać wymagane stronycall_user_func('drupal_add_' . $type, $data, $options);
David Thomas
1
Tak, ale drupal_process_attacheduruchamia się po pobraniu pamięci podręcznej renderowania. Jeśli to zrobisz, #attachedTwój CSS / JS zostanie dodany, nawet jeśli używana jest pamięć podręczna renderowania.
2
Wygląda na to, że hook_page_build nie jest już czymś w D8?
digitgopher
4

hook_page_build () został wycofany na korzyść hook_page_attachments () Zmień zapis tutaj .

Przykład:

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

nazwa_biblioteki to nazwa biblioteki zdefiniowana w module mymodule.libraries.yml

pferlito
źródło