Hook_init () ainda é usado? Se não for mais usado, como converter código implementando hook_init ()?

10

Observando a API do Drupal.org , notei que hook_init () não está documentado para o Drupal 8. Observando os registros de alterações, descobri que os ganchos do Bootstrap não existem mais , o que aponta para Livrar-se de todos os ganchos 'bootstrap' , onde os ganchos do bootstrap é dito ser hook_boot()e hook_exit(); nada é dito sobre hook_init().

Eu procurei por hook_init na fonte Drupal 8 e encontrei o seguinte código. O primeiro é uma referência a ser hook_init()feita em um comentário; os outros dois parecem uma hook_init()implementação, mas ambos recebem um parâmetro que não estou esperando.

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

Também procurei por qualquer função que chamava, hook_init()mas não encontrei nenhuma.

hook_init()Ainda é usado no Drupal 8? Se não for mais usado, como converto a implementação do código Drupal 7 hook_init()?

kiamlaluno
fonte

Respostas:

6

Talvez isso tenha mudado desde a última resposta desta pergunta. Mas acho que a abordagem preferida para substituir o que está acontecendo hook_inité criar um assinante de evento e adicioná-lo à 'solicitação'. Aqui está como você faz isso para aqueles que podem achar útil.

Exemplo services.yml

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

Em seguida, você implementaria o EventSubscriberInterface(novo arquivo no src/EventSubscriberdiretório) e, no método implementado, getSubscribedEventspoderá fazer algo como ...

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

E adicione o método de acordo

/**
 * MyModule
 *
 * @param \Symfony\Component\HttpKernel\Event\GetResponseEvent $event
 *   The event to process.
 */
public function initializeMyModule(GetResponseEvent $event) {
  $request = $event->getRequest();   
  ...
}
Michael Bopp
fonte
Como usar ['#attached] [' js] na função initializeMyModule? Desde que não haja $ var, $ page ou algum argumento na função.
Neha
@neha - Você não. Esta resposta lida com como substituir o hook init por coisas mais avançadas. Mas para anexar bibliotecas você usa hook_page_attachmentsou hook_page_attachments_alter.
Leymannx
5

Sim, hook_init()não é usado no Drupal 8. Se você precisar drupal_add_js()ou drupal_add_css()poderá usá-lo hook_page_build()( nota : esse gancho foi removido no Drupal 8.0.0-beta3, consulte o registro de alterações ), o que também é útil para o Drupal 7.

Por exemplo, estilos CSS e código JavaScript podem ser adicionados ao 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);

Se você precisar fazer uma escuta mais complexa na solicitação / resposta, poderá definir um ouvinte de eventos do kernel no estilo Drupal 8, conforme documentado em hook_init () removido .

David Thomas
fonte
4
Você nunca deve usar drupal_add_js / drupal_add_css - mesmo no Drupal 7 eles são melhor evitados - use melhor #attached. Eu removi esta parte.
1
@chx, drupal_process_attachedtambém usa drupal_add_css / js para adicionar os requisitos de página emcall_user_func('drupal_add_' . $type, $data, $options);
David Thomas
1
Sim, mas é drupal_process_attachedacionado após o cache de renderização ser recuperado. Se você o fizer #attached, seu CSS / JS será adicionado mesmo quando o cache de renderização for usado.
2
Parece que hook_page_build não é mais uma coisa no D8?
Digitopher
4

hook_page_build () foi descontinuado em favor do registro de alterações hook_page_attachments () aqui .

Exemplo:

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

libraryname é o nome da biblioteca, definido em mymodule.libraries.yml do seu módulo

pferlito
fonte