web-dev-qa-db-ja.com

イベント応答が匿名ユーザーを起動しない

Drupal8にモジュールがあり、URLをリダイレクトするのがイベントレスポンスのジョブのみです。匿名ユーザーを除くすべてのユーザーに問題なく機能します。がログインしているかどうかに関係なく、すべてのユーザーに起動する権限をモジュールに付与するにはどうすればよいですか。

これは、geographic_me_redirect.services.ymlです。

services:
  me_redirect.process_me_request:
    class: Drupal\me_redirect\EventSubscriber\ResponseSubscriber
    arguments: []
    tags:
      - { name: event_subscriber }

これが反応です

class ResponseSubscriber implements EventSubscriberInterface
{


    /**
     * Constructor.
     */
    public function __construct()
    {

    }

    /**
     * {@inheritdoc}
     */
    public static function getSubscribedEvents()
    {

        ///$events[KernelEvents::REQUEST][] = ['onRouteMatch', 27];
        //-- fires the event in the kernal early oo page load 20
        $events[KernelEvents::RESPONSE] = ['process_language_request',0];
        //-- For redirecting to another domain

        return $events;
    }



    public function process_language_request(FilterResponseEvent $event)
    {

    return my logic

    }
}
5
purencool

リダイレクトが既に内部ページキャッシュに格納されている場合は、これを行うことはできません。匿名トラフィックは、イベントが発生する前にこのキャッシュから提供されるためです。

このキルスイッチを使用する必要があります。

\Drupal::service('page_cache_kill_switch')->trigger();

これをイベントサブスクライバーに入れてキャッシュをクリアすると、応答が内部ページキャッシュにキャッシュされなくなります。

3
4k4

URLにリダイレクトするだけの場合は、次のようなクラスを使用できます。

<?php

namespace Drupal\my_event\EventSubscriber;

use Drupal\Core\Cache\CacheableMetadata;
use Drupal\Core\Routing\TrustedRedirectResponse;
use Drupal\Core\Url;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpKernel\KernelEvents;

/**
 * Class MyEventSubscriber.
 *
 * @package Drupal\my_event
 */
class MyEventSubscriber implements EventSubscriberInterface {


  /**
   * {@inheritdoc}
   */
  static function getSubscribedEvents() {
    $events[KernelEvents::REQUEST][] = ['processEvent', 0];
    return $events;
  }

  /**
   * Redirect and cache with anonymous user
   * @param \Symfony\Component\HttpKernel\Event\GetResponseEvent $event
   * @param \Drupal\Core\Url $url
   */
  protected function setResponse(GetResponseEvent $event, Url $url) {
    $response = new TrustedRedirectResponse($url->toString(), 301);
    $response->addCacheableDependency(CacheableMetadata::createFromRenderArray([])
      ->addCacheTags(['rendered']));
    $event->setResponse($response);
  }

  /**
   * Process with difference condition
   * @param \Symfony\Component\HttpKernel\Event\GetResponseEvent $event
   */
  public function processEvent(GetResponseEvent $event) {
    $logic = $this->checkLogic();
    if ($logic) {
      $this->setResponse($event, Url::fromUri("https://www.example.com"));
    }
  }

  /**
   * Check logic redirect
   * @return boolean logic
   */
  protected function checkLogic() {
    return $logic;
  }
}

ここでの魔法はメソッドsetResponseです。私はイベントKernelEvents :: REQUESTを使用し、メソッドsetResponseでキャッシュを設定します。匿名ユーザーで動作しています。

0
MrD