Tôi đã gặp phải một vấn đề trong đó một khối duy nhất trên mỗi trang không dành cho người dùng đã đăng xuất. Vấn đề là một plugin khối tùy chỉnh tôi có trên trang tìm kiếm lượt xem có chứa các bộ lọc tùy chỉnh (giống như một thay thế tùy chỉnh cho các bộ lọc bị lộ. Khối được đặt qua / admin / architecture / block).
Dựa trên những gì tôi đã học được về Drupal 8, tôi đã thêm bối cảnh bộ đệm vào mảng xây dựng của mình:
public function build() {
$search_form = \Drupal::formBuilder()->getForm('Drupal\mymodule\Form\SearchForm');
return [
'search_form' => $search_form,
'#cache' => ['contexts' => ['url.path', 'url.query_args']]
];
}
Nhưng có vẻ như điều này không chính xác vì khi đăng xuất, khối sẽ được lưu vào bộ đệm ở chế độ xem đầu tiên và khi url thay đổi, nó không hiển thị phiên bản mới của khối.
Tôi nghĩ rằng nó có thể là trang xem gây ra sự cố, nhưng ngay cả khi tôi tắt bộ nhớ đệm trên trang xem, vấn đề vẫn còn.
Tôi đã có thể khắc phục sự cố theo một số cách, ví dụ, bằng cách sử dụng hook pre process_block:
function mymodule_preprocess_block__mycustomsearchblock(&$variables) {
$variables['#cache']['contexts'][] = 'url.path';
$variables['#cache']['contexts'][] = 'url.query_args';
}
Nhưng điều đó làm phiền tôi, tôi không thể đặt bối cảnh bộ đệm vào mảng xây dựng của khối.
Vì khối của tôi mở rộng BlockBase, tôi đã quyết định thử phương thức getCacheContexts (), đặc biệt khi tôi thấy một số mô-đun trong lõi đang thực hiện theo cách này.
public function getCacheContexts() {
return Cache::mergeContexts(parent::getCacheContexts(), ['url.path', 'url.query_args']);
}
Điều này cũng đã được khắc phục sự cố, nhưng thật thú vị, khi tôi xuất các biến trong hàm khối tiền xử lý, chúng không hiển thị trong các biến $ ['# cache'] ['bối cảnh'], nhưng chúng hiển thị trong các phần tử $ biến [' '] [' # cache '] [' bối cảnh ']
array:5 [▼
0 => "languages:language_interface"
1 => "theme"
2 => "url.path"
3 => "url.query_args"
4 => "user.permissions"
]
Tôi đang cố gắng tìm hiểu làm thế nào điều này hoạt động, và tại sao nó không hoạt động từ chức năng xây dựng.
Nhìn vào /core/modules/block/src/BlockViewBuilder.php tại hàm viewMult Môn (), có vẻ như nó kéo các thẻ bộ đệm từ thực thể và plugin:
'contexts' => Cache::mergeContexts(
$entity->getCacheContexts(),
$plugin->getCacheContexts()
),
Vì vậy, điều đó giải thích tại sao việc thêm phương thức getCacheContexts () vào plugin khối của tôi lại thêm bối cảnh vào khối của tôi. Ngoài ra, nhìn vào phương thức preRender trong cùng một lớp, có vẻ như nó không sử dụng mảng bộ đệm trong hàm xây dựng khối, điều này làm tôi bối rối, vì có vẻ như cách thêm bộ đệm vào Drupal 8 là thêm #cache yếu tố để kết xuất các yếu tố.
Vì vậy, câu hỏi của tôi là,
1) Các bối cảnh bộ đệm được thêm trực tiếp vào mảng trong một plugin khối bị bỏ qua?
2) Nếu vậy, có cách nào khác không, chúng ta có cần thêm nó vào một phần tử con của mảng xây dựng không?
3) Nếu bối cảnh được thêm trực tiếp bị bỏ qua, việc thêm getCacheContexts () có phải là cách để bổ sung khối trong các mô-đun tùy chỉnh không?