hook_init ()가 여전히 사용됩니까? 더 이상 사용되지 않으면 hook_init ()를 구현하는 코드를 어떻게 변환합니까?


10

Drupal.org API를 찾고, 나는 것으로 나타났습니다 hook_init는 () 변경 기록을 보면 드루팔 (8)에 대한 문서화되어 있지 않습니다, 나는 발견 부트 스트랩이 더 이상 존재 후크 없다 하는 점, 모든 '부트 스트랩'후크를 제거하기 , 부트 스트랩 후크를 이라고되어 hook_boot()hook_exit(); 아무 말도하지 않았다 hook_init().

Drupal 8 소스에서 hook_init를 검색했으며 다음 코드를 찾았습니다. 첫 번째 hook_init()는 주석에 대한 참조입니다 . 다른 두 개는 hook_init()구현으로 보이지만 예상하지 않은 매개 변수를 얻습니다.

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

또한 호출하는 함수를 찾았 hook_init()지만 찾지 못했습니다.

되어 hook_init()여전히 드루팔 (8)에 사용? 더 이상 사용되지 않으면 Drupal 7 코드 구현을 hook_init()어떻게 변환 합니까?

답변:


6

이 질문에 마지막으로 답변 한 이후에 변경되었을 수도 있습니다. 그러나 현재 진행중인 것을 대체하는 선호되는 접근 방식 hook_init은 이벤트 구독자를 만들고 '요청'에 추가하는 것입니다. 다음은 유용하다고 생각되는 사람들을위한 방법입니다.

services.yml 예

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

그런 다음 EventSubscriberInterface( src/EventSubscriber디렉토리의 새 파일 )을 구현하고 구현 된 메소드에서 getSubscribedEvents다음과 같은 작업을 수행 할 수 있습니다 ...

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

그리고 그에 따라 방법을 추가하십시오

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

initializeMyModule 함수에서 [ '#attached] ['js]를 사용하는 방법은 무엇입니까? 함수에 $ var, $ page 또는 다른 인수가 없습니다.
neha

@neha – 당신은하지 않습니다. 이 답변은 고급 기능을 위해 hook init을 교체하는 방법에 대처합니다. 그러나 라이브러리를 연결하려면 hook_page_attachments또는 을 사용하십시오 hook_page_attachments_alter.
leymannx

5

예, hook_init()Drupal 8에서는 사용되지 않습니다. 필요한 경우 drupal_add_js()또는 대신 drupal_add_css()사용할 수 있습니다 hook_page_build()( 참고 :이 후크는 Drupal 8.0.0-beta3에서 제거되었으며 변경 기록 참조 ). 이는 Drupal 7에서도 유용합니다.

예를 들어 CSS 스타일과 JavaScript 코드를 hook_page_build()사용하여 추가 할 수 있습니다 $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);

요청 / 응답에 대해 더 복잡한 청취를 수행해야하는 경우 hook_init () removed 에 설명 된대로 Drupal 8 스타일 커널 이벤트 리스너를 정의 할 수 있습니다 .


4
drupal_add_js / drupal_add_css를 사용해서는 안됩니다. Drupal 7에서도 피하는 것이 좋습니다. #attached를 더 잘 사용하십시오. 이 부분을 제거했습니다.

1
@chx는 drupal_process_attached또한 drupal_add_css / js를 사용하여 페이지 요구 사항을 추가합니다.call_user_func('drupal_add_' . $type, $data, $options);
David Thomas

1
예.하지만 렌더 캐시가 검색된 후에drupal_process_attached 발생 합니다. 그렇게 하면 렌더 캐시를 사용하더라도 CSS / JS가 추가됩니다. #attached

2
D8에서는 hook_page_build가 더 이상 존재하지 않는 것 같습니다.
digitgopher

4

hook_page_build ()는 hook_page_attachments () 변경 레코드 here 으로 인해 더 이상 사용되지 않습니다 .

예:

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

libraryname은 모듈의 mymodule.libraries.yml에 정의 된 라이브러리의 이름입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.