Puncte:2

În cazul abonatului evenimentului, cum se redirecționează dacă valoarea nu există?

drapel zw

Încerc să verific o condiție înainte de a încărca pagina, dacă există valoare pentru a încărca pagina dacă nu pentru a redirecționa.

Urmăresc asta pagină

Am creat un fișier /mymodule/mymodule.services.yml și un fișier /mymodule/src/MyModuleSubscriber.php.

În MyModuleSubscriber.php aș dori să verific dacă există o valoare, dacă se întâmplă pentru a încărca site-ul în mod normal, dacă valoarea nu există pentru a efectua redirecționare.

Acesta este codul, dar nu sunt sigur cum să-l scrieți corect. Trebuie să pun o declarație else sau să las necompletat?

Este acest mod corect de a verifica existența unei valori la fiecare încărcare a paginii?

clasa MyModuleSubscriber implementează EventSubscriberInterface {

      funcție publică checkForRedirect(GetResponseEvent $event) {

          $baseUrl = $event->getRequest()->getBaseUrl();

          if($valoare == null &&
             $baseURL !== '/MyModulePage') {
              $event->setResponse(new RedirectResponse($baseUrl.'/MyModulePage'));
          }
      }


  /**
   * {@inheritdoc}
   */
  funcția statică getSubscribedEvents() {
    $events[KernelEvents::REQUEST][] = array('MyModuleLoad', 200);
    returnează $evenimente;
  }
}

Editați | ×:

      $cale = \Drupal::service('path.current')->getPath();

      if($cale !== '/MyModulePage') {
          $event->setResponse(new RedirectResponse('/MyModulePage'));
      }
May  avatar
drapel zw
Editare: au codul actualizat. Ceea ce ar trebui să se întâmple este dacă vizitatorul nu ajunge pe /MyModulePage pentru a-l redirecționa către /MyModulePage. Dar nu se întâmplă nimic.
4uk4 avatar
drapel cn
Serviciul `path.current` este actualizat în timpul rutării, devreme trebuie să obțineți calea de la `$event->getRequest()->getPathInfo()`.
May  avatar
drapel zw
Salut, inca nu functioneaza. Cred că este o problemă de cache? Uneori funcționează, alteori nu. Trebuie să rulez pe middleware sau pot să actualizez codul. Practic, am nevoie de declarația if verificată la fiecare încărcare a paginii. Mulțumiri
4uk4 avatar
drapel cn
Răspunsul meu explică modul în care Drupal face ca redirecționările să fie stocate în cache. Dacă insistați ca codul dvs. să ruleze la fiecare încărcare a paginii, ceea ce înseamnă practic că nu doriți să memorați deloc redirecționarea în cache, atunci mai întâi trebuie să vă ocupați de memorarea în cache a browserului, acestea memorează redirecționările în cache destul de agresiv și, în al doilea rând, trebuie să dezactivați memoria cache a paginii interne. Consultați [comentul](https://drupal.stackexchange.com/questions/278698/disabling-page-cache-for-redirect-response/278703#comment346356_278698) despre subiectul pe care l-am legat la sfârșitul răspunsului.
Puncte:4
drapel cn

Da, aceasta este o abordare corectă. Nu aveți nevoie de o altă declarație. Dacă nu setați un răspuns, propagarea evenimentului nu se oprește, iar abonații la eveniment cu o prioritate mai mică au șansa de a seta un răspuns. Prioritatea depinde de $value. Nu este clar în întrebarea dvs., dar dacă nu depinde de nimic specific Drupal, atunci setați o prioritate >300.

Cea mai bună practică este să folosiți un răspuns stocabil în cache și să adăugați orice dependențe de $value la răspuns. Dacă nu aveți niciunul, folosiți totuși acest răspuns. Îi spune lui Drupal că sunteți în regulă că este stocat în cache cum doriți să redirecționați această cale.

Exemplu:

core/lib/Drupal/Core/EventSubscriber/RedirectLeadingSlashesSubscriber.php

<?php

spațiu de nume Drupal\Core\EventSubscriber;

utilizați Drupal\Core\Cache\CacheableRedirectResponse;
utilizați Symfony\Component\HttpKernel\Event\RequestEvent;
utilizați Symfony\Component\HttpKernel\KernelEvents;
utilizați Symfony\Component\EventDispatcher\EventSubscriberInterface;

/**
 * Redirecționează căile care încep cu mai multe bare oblice către o singură bară.
 */
clasa RedirectLeadingSlashesSubscriber implementează EventSubscriberInterface {

  /**
   * Redirecționează căile care încep cu mai multe bare oblice către o singură bară.
   *
   * @param \Symfony\Component\HttpKernel\Event\RequestEvent $event
   * RequestEvent de procesat.
   */
  redirecționare funcție publică(RequestEvent $event) {
    $cerere = $eveniment->getRequest();
    // Obține calea solicitată minus calea de bază.
    $cale = $cerere->getPathInfo();

    // Este imposibil să creezi o legătură sau o rută către o cale începând cu
    // mai multe bare oblice. Cu toate acestea, dacă se adaugă un formular la pagina 404, acesta
    // trimite înapoi la același URI, aceasta prezintă o redirecționare deschisă
    // vulnerabilitate. De asemenea, Drupal 7 redă aceeași pagină pentru
    // http://www.example.org/foo și http://www.example.org////foo.
    if (strpos($cale, '//') === 0) {
      $cale = '/' . ltrim($cale, '/');
      $qs = $request->getQueryString();
      dacă ($qs) {
        $qs = '?' . $qs;
      }
      $event->setResponse(new CacheableRedirectResponse($request->getUriForPath($path) . $qs));
    }
  }

  /**
   * {@inheritdoc}
   */
  funcție publică statică getSubscribedEvents() {
    $events[KernelEvents::REQUEST][] = ['redirect', 1000];
    returnează $evenimente;
  }

}

Dacă $value este specific Drupal, de exemplu îl obțineți de la o entitate, utilizați prioritatea implicită 0 și setați entitatea ca dependență de cache. În acest caz, trebuie să setați anteturi de răspuns pentru a preveni ca browserul să memoreze în cache rezultatul redirecționării pentru această cale. Utilizare LocalRedirectResponse pentru local sau TrustedRedirectResponse pentru adrese URL externe. Vezi acest răspuns grozav Dezactivarea memoriei cache a paginii pentru răspunsul de redirecționare

May  avatar
drapel zw
Bună @4k4, mi-am actualizat postarea. Ceea ce ar trebui să se întâmple este dacă vizitatorul nu ajunge pe MyModulePage pentru a fi redirecționat către MyModulePage.Cu toate acestea, nu se întâmplă nimic. Mulțumiri

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.