Я хотел бы просто вернуть подходящее сообщение, например, return new Response('authentication faild');
для моего клиента через API, но он не ведет себя так, как предполагается, как в следующем коде
try{ $token = $this->get('security.authentication.manager') ->authenticate(new UsernamePasswordToken($username, $password, 'main')); $this->get('security.context')->setToken($token); } catch (BadCredentialsException $e){ return new Response('authentication faild', 403); }
Обнаружена ошибка: код html / css … формы входа в систему
Посмотри на это:
<?php namespace YourBundle\EventListener; use Symfony\Component\EventDispatcher\EventSubscriberInterface; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent; class CatchErrorsEventSubscriber implements EventSubscriberInterface { public static function getSubscribedEvents() { return ["kernel.exception" => ['catchException', 200]]; } /** * @param GetResponseForExceptionEvent $evt */ public function catchException(GetResponseForExceptionEvent $evt) { $request = $evt->getRequest()->getRequestFormat('json'); if($request != 'json') { return; } $response = $evt->getResponse() ?: new Response(); $evt->stopPropagation(); // stop the other listener to redirect to login $evt->setResponse($response); } }
Этот слушатель поймает исключение, и вы можете отправить ответ по вашему желанию. В этом примере только если запрос является json-запросом.
Не забудьте зарегистрировать подписчика как услугу:
<service class="YourBundle\EventListener\CatchErrorsEventSubscriber" id="your_bundle.catch_error_event_subscriber"> <tag name="kernel.event_subscriber"/> </service>