ฉันกำลังพยายามสร้างการกระทำในท้องถิ่นแบบไดนามิกผ่านอนุพันธ์ อนุพันธ์ทำงานและส่งคืนลิงก์ที่สร้างขึ้นแบบไดนามิก แต่ดูเหมือนว่าแคชจะคงค่าของมันไว้
ตามนี้ครับ บันทึกการเปลี่ยนแปลงหลักของ 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;
}
}