ฉันจะส่งผ่านข้อมูลระหว่าง hooks ที่ไม่โต้ตอบได้อย่างไร


10

ฉันจะส่งผ่านข้อมูลระหว่าง hooks ที่ไม่โต้ตอบระหว่างพวกเขาหรือระหว่างการโทรกลับเมนูและ hook ได้อย่างไร

ในกรณีที่ hooks สองตัวมีพารามิเตอร์เหมือนกันและพารามิเตอร์นั้นถูกส่งผ่านโดยการอ้างอิงซึ่งเป็นเรื่องง่าย ฉันจะทำอย่างไรเมื่อ hooks หรือ callback menu และ hook ไม่ได้รับพารามิเตอร์ทั่วไป

คำตอบ:


12

ใน Drupal 7 หรือสูงกว่าใช้ตัวแปรคงจัดการกับการdrupal_static ()
drupal_static()เป็นฟังก์ชั่นที่จัดการที่เก็บข้อมูลส่วนกลางสำหรับตัวแปรคงที่ แตกต่างจากตัวแปรที่ประกาศโดยใช้staticคีย์เวิร์ดตัวแปรแบบสแตติกที่จัดการด้วยdrupal_static()สามารถเข้าถึงได้จากทุกฟังก์ชั่น สิ่งนี้เป็นไปได้เพราะdrupal_static()ส่งคืนเนื้อหาของตัวแปรโดยอ้างอิงทำให้ทุกฟังก์ชั่นสามารถแก้ไขได้

สมมติว่าคุณต้องส่งค่าระหว่างตัวจัดการเมนูและการใช้งานhook_block_view () ; คุณสามารถใช้รหัสต่อไปนี้

function mymodule_menu() {
  return array('path/%' => array(
    'page callback' => 'mymodule_callback_function',
    'page arguments' => array(1),
  ));
}

function mymodule_callback_function($data) {
  $data_passer = &drupal_static('mymodule_block_data');

  $data_passer = $data;

  // Other logic specific to this page callback.
}

function mymodule_block_view($delta = '') {
  // $data_passer will now contain the value of $data, from above.
  $data_passer = &drupal_static('mymodule_block_data');

  // Change the block content basing on the content of $data_passer.
}

drupal_static()ในกรณีที่ข้อมูลที่จะต้องมีการเข้าถึงบ่อยครั้งมากขึ้นคุณควรใช้ตัวแปรท้องถิ่นคงที่จะมีค่าที่ส่งกลับจาก เนื่องจากตัวแปรสแตติกสามารถเริ่มต้นได้จากค่าตามตัวอักษรเท่านั้นและตัวแปรสแตติกไม่สามารถกำหนดให้กับการอ้างอิงได้รหัสการทำงานเพียงอย่างเดียวจึงคล้ายคลึงกับค่าต่อไปนี้ (รหัสนี้นำมาจากuser_access () )

  // Use the advanced drupal_static() pattern, since this is called very often.
  static $drupal_static_fast;
  if (!isset($drupal_static_fast)) {
    $drupal_static_fast['perm'] = &drupal_static(__FUNCTION__);
  }
  $perm = &$drupal_static_fast['perm'];

ค่าที่ส่งคืนจากdrupal_static()จะถูกรีเซ็ตทุกครั้งที่บูตของ Drupal ถ้าคุณต้องการค่าที่ถูกเก็บรักษาไว้ระหว่างหน้าแตกต่างกันแล้วคุณจะต้องใช้ตารางฐานข้อมูลเพื่อเก็บค่าหรือการใช้variable_get () / variable_set ()

Drupal 6 ไม่ได้ใช้drupal_static()แต่คุณสามารถคัดลอกรหัสในฟังก์ชั่นที่กำหนดไว้ในโมดูลของคุณเอง

function &mymodule_static($name, $default_value = NULL, $reset = FALSE) {
  static $data = array(), $default = array();

  // First check if dealing with a previously defined static variable.
  if (isset($data[$name]) || array_key_exists($name, $data)) {
    // Non-NULL $name and both $data[$name] and $default[$name] statics exist.
    if ($reset) {
      // Reset pre-existing static variable to its default value.
      $data[$name] = $default[$name];
    }
    return $data[$name];
  }

  // Neither $data[$name] nor $default[$name] static variables exist.
  if (isset($name)) {
    if ($reset) {
      // Reset was called before a default is set and yet a variable must be
      // returned.
      return $data;
    }
    // First call with new non-NULL $name. Initialize a new static variable.
    $default[$name] = $data[$name] = $default_value;
    return $data[$name];
  }

  // Reset all: ($name == NULL). This needs to be done one at a time so that
  // references returned by earlier invocations of drupal_static() also get
  // reset.
  foreach ($default as $name => $value) {
    $data[$name] = $value;
  }

  // As the function returns a reference, the return should always be a
  // variable.
  return $data;
}

ก่อนที่จะใช้ตัวแปรแบบคงที่ด้วยdrupal_static()(หรือฟังก์ชั่นพอร์ตด้านหลังที่กำหนดไว้ในโมดูลของคุณ) คุณควรคำนึงถึงข้อควรพิจารณาเหล่านี้:

  • รหัสทำงานเฉพาะเมื่อรหัสที่ตั้งค่าตัวแปรสแตติกรันอยู่ก่อนโค้ดเพื่อรับค่า หากลำดับการดำเนินการไม่ใช่ความคิดรหัสจะไม่ทำงาน เมื่อลำดับของการดำเนินการไม่ชัดเจนในเอกสารประกอบของ Drupal ความเสี่ยงที่คำสั่งซื้อจะเปลี่ยนไปใน Drupal รุ่นต่อไป ตรวจสอบลำดับการดำเนินการไม่เปลี่ยนแปลงในรุ่น Drupal ที่คุณใช้รหัสของคุณ
  • Drupal อาจใช้กลไกเพื่อแบ่งปันข้อมูลระหว่าง hooks ที่แตกต่างกัน ตัวอย่างเช่นในกรณีของการใช้งานที่แตกต่างกันของhook_form_alter ()การใช้งานแต่ละครั้งสามารถแบ่งปันข้อมูลกับhook_form_alter()การใช้งานอื่น ๆ ที่ใช้$form_state; ในทางเดียวกันตัวจัดการการตรวจสอบความถูกต้องของรูปแบบและตัวจัดการการส่งแบบฟอร์มสามารถแชร์ข้อมูลโดยใช้$form_stateพารามิเตอร์ที่ส่งผ่านโดยการอ้างอิง ก่อนที่จะใช้รหัสของคุณเองให้ตรวจสอบความเป็นไปได้ที่จะแบ่งปันข้อมูลโดยใช้กลไกที่แตกต่างกันซึ่ง Drupal นำไปใช้กับกรณีเฉพาะ

ขอบคุณคำตอบจริง ๆ ที่ได้รับจากโปสเตอร์ต้นฉบับ อย่างไรก็ตามข้อกังวลของฉันคือฉันได้รับการบอกว่าการใช้ตัวแปรคงที่ drupal นั้นไม่ค่อยดีนัก - สำหรับไซต์ที่จัดการคำขอจำนวนมากเนื่องจากความจริงที่ว่าชุดตัวแปรทั้งหมดถูกโหลดในแต่ละครั้งสำหรับแต่ละเซสชั่น เพื่อนร่วมงานที่ทำงานเกี่ยวกับเรื่องประสิทธิภาพที่เกี่ยวข้องกับเรื่องนี้ คุณคิดอย่างไร? พวกเขาแนะนำว่าการใช้แคช Drupal จะเป็นวิธีที่ดีกว่าในการส่งผ่านตัวแปร (โดยไม่จำเป็นหลังจากที่ได้รับข้อมูลปลายทางจากรหัสปลายทาง)
therobyouknow

@therobyouknow "สำหรับไซต์ที่จัดการคำขอจำนวนมากเนื่องจากมีการโหลดชุดตัวแปรทั้งหมดในแต่ละครั้ง" นั่นคือตารางตัวแปรและไม่ใช่ตัวแปรแบบคงที่ซึ่งแตกต่างอย่างสิ้นเชิง ตัวแปรแบบสแตติกเองมีผลกระทบต่อประสิทธิภาพการทำงานเล็กน้อย แม้แต่ในตารางตัวแปรคุณต้องใช้ระบบในทางที่ผิดเพื่อให้เกิดปัญหา Economist.com สามารถรับชมได้ 100k หลายครั้งในหนึ่งชั่วโมงซึ่งทั้งหมดนี้โหลดตารางตัวแปร ตัวแปรไม่ใช่ปัญหา แต่แน่นอนว่าเราจะเก็บข้อมูลเพียงเล็กน้อยในแต่ละตัวแปร
Letharion
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.