ฉันพบปัญหาที่บล็อกที่ไม่ซ้ำใครต่อหน้าไม่ใช่สำหรับผู้ใช้ที่ออกจากระบบ ปัญหาคือปลั๊กอินบล็อกที่กำหนดเองที่ฉันมีในหน้าค้นหามุมมองที่มีตัวกรองแบบกำหนดเอง (เรียงลำดับเหมือนการแทนที่แบบกำหนดเองสำหรับตัวกรองแบบเปิดเผยบล็อกที่วางผ่าน / admin / โครงสร้าง / บล็อก)
จากสิ่งที่ฉันได้เรียนรู้เกี่ยวกับ Drupal 8 ฉันได้เพิ่มบริบทแคชไปยังอาร์เรย์บิลด์ของฉัน:
public function build() {
$search_form = \Drupal::formBuilder()->getForm('Drupal\mymodule\Form\SearchForm');
return [
'search_form' => $search_form,
'#cache' => ['contexts' => ['url.path', 'url.query_args']]
];
}
แต่ดูเหมือนว่าสิ่งนี้จะต้องไม่ถูกต้องเพราะเมื่อออกจากระบบบล็อกจะถูกแคชในมุมมองแรกและเมื่อ URL เปลี่ยนไปมันจะไม่แสดงบล็อกเวอร์ชันใหม่
ฉันคิดว่าอาจเป็นหน้าการดูที่ทำให้เกิดปัญหา แต่แม้ว่าฉันจะปิดการแคชในหน้าการดูปัญหายังคงอยู่
ฉันสามารถแก้ไขปัญหาได้หลายวิธีตัวอย่างเช่นโดยใช้ตะขอ preprocess_block:
function mymodule_preprocess_block__mycustomsearchblock(&$variables) {
$variables['#cache']['contexts'][] = 'url.path';
$variables['#cache']['contexts'][] = 'url.query_args';
}
แต่มันรบกวนฉันฉันไม่สามารถใส่บริบทของแคชในอาร์เรย์ประกอบการบล็อกของฉันได้
เนื่องจากบล็อกของฉันขยาย BlockBase ฉันจึงตัดสินใจลองใช้เมธอด getCacheContexts () โดยเฉพาะอย่างยิ่งเมื่อฉันเห็นโมดูลบางอย่างในคอร์กำลังทำแบบนี้
public function getCacheContexts() {
return Cache::mergeContexts(parent::getCacheContexts(), ['url.path', 'url.query_args']);
}
สิ่งนี้ได้รับการแก้ไขด้วยเช่นกัน แต่ที่น่าสนใจเมื่อฉันแสดงตัวแปรในฟังก์ชั่นบล็อกก่อนการประมวลผลสิ่งเหล่านี้จะไม่แสดงในตัวแปร $ ['# แคช'] ['บริบท'] แต่แสดงในองค์ประกอบ $ ตัวแปร ['องค์ประกอบ '] [' # แคช '] [' บริบท]
array:5 [▼
0 => "languages:language_interface"
1 => "theme"
2 => "url.path"
3 => "url.query_args"
4 => "user.permissions"
]
ฉันพยายามหาวิธีการใช้งานและทำไมมันไม่ทำงานจากฟังก์ชั่นการสร้าง
ดูที่ /core/modules/block/src/BlockViewBuilder.php ที่ฟังก์ชั่น viewMultiple () ดูเหมือนว่าจะดึงแท็กแคชจากเอนทิตีและปลั๊กอิน:
'contexts' => Cache::mergeContexts(
$entity->getCacheContexts(),
$plugin->getCacheContexts()
),
ดังนั้นอธิบายว่าทำไมการเพิ่มเมธอด getCacheContexts () ลงในปลั๊กอินบล็อกของฉันเพิ่มบริบทลงในบล็อกของฉัน นอกจากนี้การดูเมธอด preRender ในคลาสเดียวกันดูเหมือนว่าไม่ได้ใช้อาร์เรย์แคชในฟังก์ชันการสร้างบล็อกซึ่งทำให้ฉันสับสนเพราะดูเหมือนว่าวิธีเพิ่มแคชใน Drupal 8 คือการเพิ่ม #cache องค์ประกอบที่จะแสดงองค์ประกอบ
ดังนั้นคำถามของฉันคือ
1) มีการเพิ่มบริบทแคชโดยตรงในอาร์เรย์ในปลั๊กอินบล็อกที่ถูกละเว้นหรือไม่?
2) ถ้าใช่มีวิธีแก้ไขไหมเราต้องเพิ่มมันเข้าไปในองค์ประกอบย่อยของ build อาร์เรย์หรือไม่?
3) หากบริบทถูกเพิ่มโดยตรงถูกเพิกเฉยการเพิ่ม getCacheContexts () วิธีที่จะใช้สำหรับบล็อกปลั๊กอินในโมดูลที่กำหนดเองได้หรือไม่