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
}
}
リダイレクトが既に内部ページキャッシュに格納されている場合は、これを行うことはできません。匿名トラフィックは、イベントが発生する前にこのキャッシュから提供されるためです。
このキルスイッチを使用する必要があります。
\Drupal::service('page_cache_kill_switch')->trigger();
これをイベントサブスクライバーに入れてキャッシュをクリアすると、応答が内部ページキャッシュにキャッシュされなくなります。
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でキャッシュを設定します。匿名ユーザーで動作しています。