Когда вы создаёте свою страницу, используя контроллер, то возможности тут же выбрать какой код ответа она возвращает нет. Контроллер занимается только формированием содержания страницы.
Таким образом, страница возвращается с кодом 200. Что делать, если нужно вернуть другой код?
В таком случает нужно модифицировать ответ сервера, подписавшись на событие KernelEvents::RESPONSE. Пример реализации подписки на события можно посмотреть вот тут.
Допустим, вы определили контроллер и описали его в my_module.routing.yml следующим образом:
1 2 3 4 5 6 7 8 |
my_module.custom_page: path: '/custom-page' defaults: _title: 'Title' _controller: '\Drupal\my_module\Controller\CustomPage::content' requirements: _permission: 'access content' |
Тогда реализация подписки может выглядеть так:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
namespace Drupal\my_module\EventSubscriber; use Symfony\Component\EventDispatcher\EventSubscriberInterface; use Symfony\Component\HttpKernel\Event\ResponseEvent; use Symfony\Component\HttpKernel\KernelEvents; class RequestSubscriber implements EventSubscriberInterface { public function changePageCode(ResponseEvent $event) { $routeName = \Drupal::routeMatch()->getRouteName(); // set 401 code if ($routeName == 'my_module.custom_page') { $response = $event->getResponse(); $response->setStatusCode(401); } } /** * {@inheritdoc} */ public static function getSubscribedEvents() { return [ KernelEvents::RESPONSE => [['changePageCode']], ]; } } |
Так для указанного маршрута вы меняете код ответа (в примере — 401).
Не забудьте добавить подписчика в my_module.services.yml:
1 2 3 4 5 |
services: my_module.subscriber: class: Drupal\my_module\EventSubscriber\RequestSubscriber tags: - { name: event_subscriber } |