Puncte:0

EventSubscriber pentru a adăuga context cache pentru o anumită cale

drapel cn

Lucrez cu modulul Mobile Detect și din câte am înțeles, trebuie să adăugăm manual contextul cache-ului mobile_detect_is_mobile pentru ca pagina să fie stocată în cache diferit în funcție de tipul dispozitivului utilizatorului. Am reușit să-l fac să funcționeze aplicând contextul cache folosind un preproces pe paragraful meu astfel:

funcția hook_preprocess_paragraph(&$variabile){
    $variables['#cache']['contexts'][] = 'mobile_detect_is_mobile';
}

Deși, nu-mi place ideea de a adăuga context la nivel de preproces și am căutat să am o soluție mai globală folosind un EventSubscriber care verifică calea și aplică contextul cache pentru anumite căi. Se pare că contextul cache-ului nu este luat în considerare. Aici abonatul meu la eveniment:

clasa MobileDetectSubscriber implementează EventSubscriberInterface {

    /**
     * @var \Symfony\Component\HttpFoundation\Request
     */
    protected $request;

    /**
     * @param \Symfony\Component\HttpFoundation\RequestStack $request_stack
     */
    funcția publică __construct(RequestStack $request_stack) {
    $this->request = $request_stack->getCurrentRequest();;
    }

    /**
     * @param \Symfony\Component\HttpKernel\Event\FilterResponseEvent $event
     * Evenimentul de procesat.
     */
    funcția publică onRespond(FilterResponseEvent $event) {
        dacă (!$eveniment
            ->isMasterRequest()) {
            întoarcere;
        }
        $răspuns = $eveniment
            ->getResponse();
        dacă (!$instanță de răspuns din CacheableResponseInterface) {
            întoarcere;
        }

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

    /**
     * @return matrice
     * O serie de definiții de ascultător de evenimente.
     */
    funcție publică statică getSubscribedEvents() {
        // Prioritatea 5, astfel încât să ruleze înainte de FinishResponseSubscriber, dar după
        // abonați la evenimente care adaugă metadatele asociate de stocare în cache (care
        // au prioritate 10). Acesta este condiționat, așa că trebuie să alerge după acestea.
        $events[KernelEvents::RESPONSE][] = ['onRespond', 5];
        returnează $evenimente;
    }
}

Ce îmi lipsește?

miststudent2011 avatar
drapel fr
Ați scris și servicii.yml?
Puncte:2
drapel cn

Adăugarea contextului cache la răspuns nu este mai globală. Este chiar invers.Numai dacă puneți contextul cache în același element de randare care depinde de acest context, acesta poate fi îmbinat în toate nivelurile de cache afectate. În acest exemplu, contextul paragrafului va fi îmbinat cu nodul părinte și apoi cu pagina. Paragraful și nodul pot fi, de asemenea, într-un bloc sau o vizualizare. Toate aceste elemente au nevoie de acel context cache.

Adăugarea contextului cache într-un cârlig de preproces este într-adevăr ultima soluție în procesul de redare a unui șablon. Există cod suplimentar în Drupal care verifică partea de sus a $variabilelor unui cârlig de preprocesare și îmbină metadatele din cache în șablon.

Cu toate acestea, ideea din spatele metadatelor cache este să le adăugați direct la matricea de compilare atunci când se generează conținut în cod, astfel încât să poată apărea în toate șabloanele implicate. Acest lucru funcționează și atunci când se refactorizează codul la o funcție utilizată în locuri diferite. De exemplu, o funcție Twig:

$build = [];
// construiește conținut
$build['#cache']['contexts'][] = 'mobile_detect_is_mobile';
// fie returnează tabloul de compilare pentru a fi redat în {{ }}
returnează $build;
// sau dacă funcția dvs. Twig nu returnează $build bubble, cel puțin metadatele 
// redându-l în interiorul funcției Twig
\Drupal::service('renderer')->render($build);

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.