Làm cách nào để tắt Twig và chặn bộ đệm cho một mô-đun cụ thể?


15

Tôi đang làm việc trên một mô-đun trong Drupal 8 để lấy dữ liệu nhạy cảm về thời gian từ một api REST bên ngoài. Dữ liệu được xử lý và chuyển tiếp đến một Khối. Dữ liệu cuối cùng được gửi đến một mẫu Twig như vậy:

...

public function build() {
  $build = [];

  $build['ticker_block'] = [
    '#theme' => 'module_theme',
    '#data' => $myService->data(),
  ];

  return $build;
}

Điều này không hoạt động trên môi trường sản xuất nơi bộ đệm được bật và dữ liệu được hiển thị hiển thị dưới dạng cũ. Làm cách nào để tôi chỉ tắt bộ đệm cho mô-đun của mình và tôi có phải làm điều đó cho cả mẫu Twig và plugin Chặn không?

Câu trả lời:


27

Bạn có thể kiểm soát bộ đệm trong mảng kết xuất với phần tử #cache.

Để tắt bộ đệm, thêm:

$build['#cache']['max-age'] = 0;

Trong trường hợp này, khối sẽ không được lưu trong bộ nhớ cache cho người dùng đã đăng nhập hoặc người dùng ẩn danh với một phiên.

Nếu bạn muốn tắt bộ đệm cho người dùng ẩn danh mà không có phiên:

Vô hiệu hóa nó bằng cách gỡ cài đặt hoàn toàn mô-đun page_cache hoặc bằng cách kích hoạt khóa chuyển đổi, xem Làm cách nào tôi có thể ngăn một trang cụ thể được lưu trong bộ nhớ cache? ví dụ.

Bộ nhớ đệm của mã twig không được kết nối với điều này, mã twig chỉ được lưu trong bộ nhớ cache một lần, lần đầu tiên nó được sử dụng sau khi bạn xóa bộ đệm.

(chỉnh sửa acc. để bình luận của Berdir)


Tôi cho rằng bối cảnh bộ đệm sẽ không giúp ích trong trường hợp cụ thể này, nhưng có lẽ bạn muốn sử dụng tuổi tối đa thực tế thay vì 0 đã vô hiệu hóa bộ nhớ đệm hoàn toàn, như 60. Không chắc chắn thời gian của dữ liệu của bạn nhạy cảm như thế nào, nhưng thông thường, mọi thứ có thể được lưu trữ trong một vài phút Ngoài ra, lưu ý rằng tuổi tối đa không ảnh hưởng đến bộ đệm trang ẩn danh. Nếu bạn cần điều này cho người dùng ẩn danh, bạn cần phải vô hiệu hóa hoàn toàn hoặc tìm nạp dữ liệu bằng cách sử dụng javascript.
Berdir

@Berdir: Tôi sử dụng max-age = 0 cho người dùng ẩn danh, nhưng có phiên. Điều này hiện đang làm việc trong dev. Bạn có nghĩ rằng điều này là OK cho sản xuất? Bạn có ý nghĩa gì với việc vô hiệu hóa hoàn toàn?
4k4

Thật tốt nếu bạn có phiên, sau đó nó hoạt động. Vô hiệu hóa nó bằng cách gỡ cài đặt hoàn toàn mô-đun page_cache hoặc bằng cách kích hoạt khóa chuyển đổi, xem drupal.stackexchange.com/questions/151254/ ví dụ.
Berdir

Cảm ơn bạn đã thông tin tuyệt vời, tôi đã thêm điều này trong câu trả lời.
4k4

1
$ build ['# cache'] ['max-age'] = 0; đã lừa Bia tất cả các vòng! :)
Sorin

6

Để dừng bộ đệm ẩn một khối cụ thể:

/**
 * Implements hook_preprocess_HOOK() for block.html.twig.
 */
function template-name_preprocess_block(&$vars) {
  if($vars['derivative_plugin_id'] == 'add-block-id-name') {
    //-- This stops the block being cache in drupal 8
    $vars['#cache']['max-age'] = 0;

  }

Câu trả lời tuyệt vời.
Học sinh

2

Vô hiệu hóa bộ đệm cho một trang / loại nội dung / bộ điều khiển cụ thể

Vô hiệu hóa bộ đệm cho một trang tùy chỉnh từ khai báo tuyến đường.

Nếu bạn muốn tắt bộ đệm cho bộ điều khiển tùy chỉnh (Mô-đun tùy chỉnh), Bạn có no_cachetùy chọn (YOU_MODULE.routing.yml). Ví dụ: Tệp: mymodule.routing.yml

mymodule.myroute:
  path: '/mymodule/mypage'
  defaults:
    _controller: '\Drupal\mymodule\Controller\Pages::mypage'
    _title: 'No cache page'
  requirements:
    _access: 'TRUE'
  options:
    no_cache: 'TRUE'

Đã thêm tùy chọn tuyến 'no_cache' để đánh dấu các phản hồi của tuyến là không thể truy cập


0

Để ngăn chặn bộ đệm của một khối cụ thể:

thêm mã dưới đây vào tệp theme_name.theme

function theme_name_preprocess_block(&$variables) {
  if ($variables['plugin_id'] == 'block_id') {
    $variables['#cache']['max-age'] = 0;
  }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.