Score:0

ตั้งค่าไม่แคชเมื่อสร้างการดำเนินการในท้องถิ่นแบบไดนามิกผ่านอนุพันธ์

ธง vn

ฉันกำลังพยายามสร้างการกระทำในท้องถิ่นแบบไดนามิกผ่านอนุพันธ์ อนุพันธ์ทำงานและส่งคืนลิงก์ที่สร้างขึ้นแบบไดนามิก แต่ดูเหมือนว่าแคชจะคงค่าของมันไว้

ตามนี้ครับ บันทึกการเปลี่ยนแปลงหลักของ Drupalฉันเข้าใจว่าฉันสามารถตั้งค่าพารามิเตอร์แคชบนอนุพันธ์ได้ ซึ่งฉันได้พยายามแล้ว แต่ก็ไร้ผล จนถึงตอนนี้ ฉันยังไม่คุ้นเคยกับแนวคิดเหล่านี้มากนัก ขอขอบคุณสำหรับคำแนะนำเกี่ยวกับวิธีป้องกัน $gid จากการถูกแคช

นี่คือการกระทำในท้องถิ่นของฉัน Leads.links.action.yml:

Leads.new_deal:
  ที่มา: 'Drupal\leads\Plugin\Derivative\DynamicLocalTasks'

นี่คืออนุพันธ์ของฉัน:

<?php

เนมสเปซ Drupal\leads\Plugin\Derivative;

ใช้ Drupal\Component\Plugin\Derivative\DeriverBase;
ใช้ Drupal\Core\Cache\CacheableDependencyInterface;
ใช้ Drupal\Core\Cache\CacheableDependencyTrait;


/**
* กำหนดงานท้องถิ่นแบบไดนามิก
*/
คลาส DynamicLocalTasks ขยาย DeriverBase {
  ใช้ CacheableDependencyTrait;
  /**
  * {@inheritdoc}
  */
  ฟังก์ชันสาธารณะ getDerivativeDefinitions($base_plugin_definition) {
    $groupLead = getGroupsUserIsLead();

    ถ้า (isset($groupLead[0])){
      $gid = $groupLead[0];
    }
    อื่น{
      กลับ \Drupal\Core\Access\AccessResult::forbidden();
    }

    // ใช้ตรรกะไดนามิกเพื่อให้ค่าสำหรับคีย์เดียวกับใน example.links.task.yml
    $this->derivatives['leads.new_deal'] = $base_plugin_definition;
    $this->derivatives['leads.new_deal']['title'] = "ข้อตกลงใหม่";
    $this->อนุพันธ์['leads.new_deal']['route_name'] = 'entity.group_content.create_form';
    $this->derivatives['leads.new_deal']['appears_on'] = ['leads.deals'];
    $this->derivatives['leads.new_deal']['route_parameters'] = ['plugin_id' => 'group_node:deals','group' => $gid];
    $this->cacheMaxAge = 0;
    $this->getCacheMaxAge();
    
    ส่งคืนพาเรนต์::getDerivativeDefinitions($base_plugin_definition);
  }

  ฟังก์ชั่นสาธารณะ getCacheMaxAge () {
    กลับ 0;
  }

}
Score:2
ธง cn

การเพิ่ม CacheableDependencyTrait ให้กับผู้สืบทอดไม่ได้ทำให้สามารถแคชได้อย่างสมบูรณ์ ไม่มีรหัสในการตรวจสอบ Drupal สำหรับการพึ่งพาที่แคชได้ของผู้สืบทอดในคำขอปกติ คุณต้องส่งคืนชื่อ ชื่อเส้นทาง และอื่นๆ จากปลั๊กอินงานในเครื่อง ซึ่งคุณสามารถใช้เมธอด getCache*() ได้ ดู https://drupal.stackexchange.com/a/273293/47547

Score:1
ธง vn

ตามที่แนะนำโดย @ 4uk4 นี่คือสิ่งที่ฉันทำ:

Leads.new_deal:
  route_name: entity.group_content.create_form
  ชื่อเรื่อง: 'ข้อตกลงใหม่'
  route_parameters:
    plugin_id: group_node:deals
    กลุ่ม: 0
  คลาส: 'Drupal\leads\Plugin\Menu\DynamicLocalTasks'
  ปรากฏ_บน:
    - 'leads.deals'
<?php

เนมสเปซ Drupal\leads\Plugin\Menu;

ใช้ Drupal\Core\Menu\LocalActionDefault;
ใช้ Drupal\Core\Routing\RouteMatchInterface;

คลาส DynamicLocalTasks ขยาย LocalActionDefault {
  ฟังก์ชั่นสาธารณะ getRouteParameters (RouteMatchInterface $route_match) {
    $groupLead = getGroupsUserIsLead();

    $gid = $groupLead[0] ?? โมฆะ;

    กลับ [
      'plugin_id' => 'group_node:deals',
      'group' => $gid,
    ]; 
  }
}
vn flag
น่าสังเกตว่าฉันไม่จำเป็นต้องเปลี่ยนพฤติกรรมแคชด้วยวิธีนี้

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา