hook_init () ยังใช้อยู่หรือไม่ หากไม่ได้ใช้อีกต่อไปฉันจะแปลงรหัสที่ใช้งาน hook_init () ได้อย่างไร


10

เมื่อดูที่ Drupal.org API ฉันสังเกตว่าhook_init ()ไม่ได้รับการบันทึกไว้สำหรับ Drupal 8. เมื่อดูที่บันทึกการเปลี่ยนแปลงฉันพบว่าBootstrap hooks ไม่มีอยู่อีกต่อไปซึ่งชี้ไปที่กำจัด 'bootstrap' hooksทั้งหมดที่ซึ่ง bootstrap hooks ได้รับการกล่าวถึงhook_boot()และhook_exit(); hook_init()ไม่มีอะไรจะพูดเกี่ยวกับ

ฉันค้นหา hook_init ในซอร์ส Drupal 8 และฉันพบรหัสต่อไปนี้ คนแรกคือการอ้างอิงถึง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()ยังคงใช้ใน Drupal 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();   
  ...
}

วิธีใช้ ['#attached] [' js] ในฟังก์ชัน initializeMyModule ทำอย่างไร เนื่องจากไม่มี $ var, $ page หรืออาร์กิวเมนต์ somether ในฟังก์ชัน
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);

หากคุณต้องการที่จะทำฟังที่ซับซ้อนมากขึ้นในการร้องขอ / การตอบสนองนั้นคุณสามารถกำหนด 8 สไตล์ฟังเหตุการณ์เคอร์เนล Drupal เป็นเอกสารเกี่ยวกับhook_init () ลบออก


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ไฟหลังจากเรียกแคชการแสดงผล หากคุณทำเช่น#attachedนั้น CSS / JS ของคุณจะถูกเพิ่มแม้ว่าจะใช้แคชการแสดงผลก็ตาม

2
ปรากฏว่า hook_page_build ไม่ใช่ของ D8 อีกต่อไปใช่ไหม
กรัม

4

hook_page_build () ได้รับการคัดค้านในความโปรดปรานของhook_page_attachments () บันทึกการเปลี่ยนแปลงที่นี่

ตัวอย่าง:

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

libraryname คือชื่อของไลบรารีที่กำหนดไว้ใน mymodule.l ไลบรารี.ymlของโมดูลของคุณ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.