Điểm:0

EventSubscriber để thêm ngữ cảnh bộ đệm cho đường dẫn cụ thể

lá cờ cn

Tôi đang làm việc với mô-đun Mobile Detect và theo những gì tôi hiểu, chúng tôi cần thêm bối cảnh bộ đệm theo cách thủ công mobile_detect_is_mobile để trang được lưu vào bộ nhớ cache khác nhau dựa trên loại thiết bị người dùng. Tôi đã có thể làm cho nó hoạt động bằng cách áp dụng bối cảnh bộ đệm bằng cách sử dụng tiền xử lý trên đoạn văn của mình như sau:

hàm hook_pre process_paragraph(&$variables){
    $variables['#cache']['contexts'][] = 'mobile_detect_is_mobile';
}

Mặc dù, tôi không thích ý tưởng thêm ngữ cảnh ở cấp độ tiền xử lý và tôi đang tìm giải pháp toàn cầu hơn bằng cách sử dụng EventSubscriber để kiểm tra đường dẫn và áp dụng ngữ cảnh bộ đệm cho các đường dẫn cụ thể. Có vẻ như bối cảnh bộ đệm không được xem xét. Đây là EventSubscriber của tôi:

lớp MobileDetectSubscriber triển khai EventSubscriberInterface {

    /**
     * @var \Symfony\Component\HttpFoundation\Request
     */
    yêu cầu $ được bảo vệ;

    /**
     * @param \Symfony\Component\HttpFoundation\RequestStack $request_stack
     */
    hàm công khai __construct(RequestStack $request_stack) {
    $this->request = $request_stack->getCurrentRequest();;
    }

    /**
     * @param \Symfony\Component\HttpKernel\Event\FilterResponseEvent $event
     * Sự kiện cần xử lý.
     */
    hàm công khai onRespond(FilterResponseEvent $event) {
        nếu (!$sự kiện
            ->isMasterRequest()) {
            trở lại;
        }
        $ phản hồi = $ sự kiện
            ->getResponse();
        if (!$response instanceof CacheableResponseInterface) {
            trở lại;
        }

        if($this->request->getRequestUri() == "/"){ 
            $mobile_detect = CacheableMetadata mới();
            $mobile_detect->setCacheContexts(['mobile_detect_is_mobile']);
            $response->addCacheableDependency($mobile_detect);
        }
    }

    /**
     * @return mảng
     * Một loạt các định nghĩa người nghe sự kiện.
     */
    hàm tĩnh công khai getSubscribeEvents() {
        // Ưu tiên 5, để nó chạy trước FinishResponseSubscriber, nhưng sau
        // người đăng ký sự kiện thêm siêu dữ liệu lưu vào bộ nhớ đệm được liên kết (mà
        // có ưu tiên 10). Cái này có điều kiện nên phải chạy theo cái kia.
        $events[KernelEvents::RESPONSE][] = ['onRespond', 5];
        trả lại sự kiện $;
    }
}

Tôi đang thiếu gì?

miststudent2011 avatar
lá cờ fr
Bạn đã từng viết services.yml chưa?
Điểm:2
lá cờ cn

Việc thêm ngữ cảnh bộ đệm vào phản hồi không mang tính toàn cầu hơn. Nó hoàn toàn ngược lại.Chỉ khi bạn đặt bối cảnh bộ nhớ cache trong cùng một phần tử kết xuất phụ thuộc vào bối cảnh này thì nó mới có thể được hợp nhất vào tất cả các cấp bộ nhớ đệm bị ảnh hưởng. Trong ví dụ này, ngữ cảnh của đoạn sẽ được hợp nhất với nút cha và sau đó với trang. Đoạn và nút cũng có thể nằm trong một khối hoặc một dạng xem. Tất cả các yếu tố này cần bối cảnh bộ đệm đó.

Việc thêm ngữ cảnh bộ đệm vào hook tiền xử lý thực sự là giải pháp cuối cùng trong quá trình hiển thị mẫu. Có thêm mã trong Drupal kiểm tra phần trên cùng của $variables của hook tiền xử lý và hợp nhất siêu dữ liệu bộ đệm vào mẫu.

Tuy nhiên, ý tưởng đằng sau siêu dữ liệu bộ đệm là thêm nó trực tiếp vào mảng bản dựng khi tạo nội dung trong mã để siêu dữ liệu có thể tạo bọt cho tất cả các mẫu có liên quan. Điều này cũng hoạt động khi tái cấu trúc mã thành một chức năng được sử dụng ở những nơi khác nhau. Ví dụ: hàm Twig:

$xây dựng = [];
//xây dựng nội dung
$build['#cache']['contexts'][] = 'mobile_detect_is_mobile';
// trả về mảng xây dựng sẽ được hiển thị trong {{ }}
trả lại bản dựng $;
// hoặc nếu chức năng Twig của bạn không trả về bong bóng $build ít nhất là siêu dữ liệu 
// bằng cách hiển thị nó bên trong hàm Twig
\Drupal::service('renderer')->render($build);

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.