Là hook_init () vẫn được sử dụng? Nếu nó không còn được sử dụng nữa, làm cách nào để chuyển đổi mã triển khai hook_init ()?


10

Nhìn vào API Drupal.org, tôi nhận thấy hook_init () không được ghi lại cho Drupal 8. Nhìn vào các bản ghi thay đổi, tôi thấy các móc Bootstrap không còn tồn tại , điều này chỉ ra Loại bỏ tất cả các hook 'bootstrap' , trong đó hookststst được cho là hook_boot()hook_exit(); không có gì được nói về hook_init().

Tôi đã tìm kiếm hook_init trong nguồn Drupal 8 và tôi đã tìm thấy đoạn mã sau. Cái đầu tiên là một tài liệu tham khảo để hook_init()đưa ra trong một nhận xét; hai cái kia có vẻ như là một hook_init()triển khai, nhưng cả hai đều nhận được một tham số mà tôi không mong đợi.

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

Tôi cũng đã tìm kiếm bất kỳ chức năng nào hook_init()nhưng tôi không tìm thấy.

Được hook_init()vẫn được sử dụng trong Drupal 8? Nếu nó không còn được sử dụng nữa, làm cách nào để chuyển đổi triển khai mã Drupal 7 hook_init()?

Câu trả lời:


6

Có lẽ điều này đã thay đổi kể từ khi câu hỏi này được trả lời lần cuối. Nhưng tôi nghĩ cách tiếp cận ưa thích để thay thế những gì đang diễn ra hook_initlà tạo một người đăng ký sự kiện và thêm vào 'yêu cầu'. Đây là cách bạn làm điều đó cho những người có thể thấy nó hữu ích.

Ví dụ services.yml

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

Sau đó, bạn sẽ triển khai EventSubscriberInterface(tệp mới trong src/EventSubscriberthư mục) và trong phương thức đã thực hiện, getSubscribedEventsbạn có thể làm một cái gì đó như ...

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

Và thêm phương thức cho phù hợp

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

Làm cách nào để sử dụng ['#attached] [' js] trong chức năng khởi tạo MyModule? SInce không có đối số $ var, $ page hoặc đôi khi trong hàm.
neha

@neha - Bạn không. Câu trả lời này phù hợp với cách thay thế hook init cho những thứ cao cấp hơn. Nhưng để đính kèm thư viện bạn sử dụng hook_page_attachmentshoặc hook_page_attachments_alter.
leymannx

5

Có, hook_init()không được sử dụng trong Drupal 8. Nếu bạn cần drupal_add_js()hoặc drupal_add_css()bạn có thể sử dụng hook_page_build()thay thế ( lưu ý : móc này đã bị xóa trong Drupal 8.0.0-beta3 xem bản ghi thay đổi ), cũng hữu ích cho điều đó trong Drupal 7.

Ví dụ: các kiểu CSS và mã JavaScript có thể được thêm vào hook_page_build()bằng cách sử dụng $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);

Nếu bạn cần thực hiện nghe phức tạp hơn về yêu cầu / phản hồi ở đó, bạn có thể xác định trình lắng nghe sự kiện hạt nhân kiểu Drupal 8 như được ghi lại trên hook_init () .


4
Bạn không bao giờ nên sử dụng drupal_add_js / drupal_add_css - ngay cả trong Drupal 7, chúng vẫn nên tránh - sử dụng tốt hơn #attached. Tôi đã loại bỏ phần này.

1
@chx, drupal_process_attachedcũng sử dụng drupal_add_css / js để thêm các trang cần thiết vàocall_user_func('drupal_add_' . $type, $data, $options);
David Thomas

1
Có nhưng drupal_process_attachedkích hoạt sau khi bộ đệm kết xuất được lấy. Nếu bạn làm như vậy #attachedthì CSS / JS của bạn sẽ được thêm ngay cả khi sử dụng bộ đệm kết xuất.

2
Xuất hiện rằng hook_page_build không còn là một thứ trong D8 nữa?
chữ số

4

hook_page_build () đã không được hỗ trợ cho hồ sơ thay đổi hook_page_attachments () tại đây .

Thí dụ:

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

libraryname là tên của thư viện, được định nghĩa trong mymodule.lologists.yml của mô-đun của bạn

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.