すべてのユーザーページをフロントページにリダイレクトしますか?ユーザーページのURLが/ user/97の場合、ユーザーが管理者でない場合はフロントページにリダイレクトされます。他のユーザーがユーザーページにアクセスできないようにしたいが、管理者だけにしたい。
どうすればこれを達成できますか?
私はこのようにしてみました:
<?php
namespace Drupal\myisu_ubit\Routing;
use Drupal\Core\Routing\RouteSubscriberBase;
use Symfony\Component\Routing\RouteCollection;
// use Drupal\user\Entity\User;
/**
* Listens to the dynamic route events.
*/
class RouteSubscriber extends RouteSubscriberBase {
/**
* {@inheritdoc}
*/
protected function alterRoutes(RouteCollection $collection) {
// Change the route associated with the user profile page (/user, /user/{uid}).
if ($route = $collection->get('user.page')) {
$route->setPath('/');
}
}
}
module.services.yml:
services:
user_profile.route_subscriber:
class: Drupal\module\Routing\RouteSubscriber
tags:
- { name: event_subscriber }
ここで何が悪いのですか?
次のようにEventSubscriberを使用して解決します。
services:
my_module.event_subscriber:
class: Drupal\my_module\EventSubscriber\MyModuleSubscriber
tags:
- {name: event_subscriber}
そして、MyModuleSubscriber:
namespace Drupal\my_module\EventSubscriber;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Drupal\views\Views;
use Drupal\views\ViewExecutable;
use Drupal\user\Entity\User;
use Drupal\Core\Url;
class MyModuleSubscriber implements EventSubscriberInterface {
/**
* {@inheritdoc}
*/
public function checkForRedirection(GetResponseEvent $event) {
$request = \Drupal::request();
$requestUrl = $request->server->get('REQUEST_URI', NULL);
$userID = \Drupal::currentUser()->id();
$user = User::load($userID);
$uid = $user->get('uid')->value;
$roles = $user->getRoles();
$userPage = "/user/" . $userID;
if (
$userID !== '1' &&
!in_array('administrator', $roles) &&
$requestUrl == $userPage
) {
$path = \Drupal::service('path.alias_manager')->getAliasByPath('/');
$event->setResponse(new RedirectResponse($path, 301));
}
}
/**
* {@inheritdoc}
*/
public static function getSubscribedEvents() {
$events[KernelEvents::REQUEST][] = array('checkForRedirection');
return $events;
}
}
これが正しい方法であるかどうかはわかりませんが、私の問題は解決します。