Сегодня я хочу поделиться своим скромным опытом и показать, как можно сделать перехватчик исключений, не используя Event Listener. Но сначала пару слов о том, зачем это нужно.
Я считаю, что использование Event Listener’ов в обычном приложении делает код запутанным, к тому же многие неопытные разработчики злоупотребляют данным подходом (сам так делал). А вот использование сервисов делает код понятным, так как они вызываются в том месте, в котором объявлены. И как вы уже поняли, далее речь пойдет именно о сервисах.
Итак, начнем.
Сначала переопределим ExceptionController, о чем скромно намекает официальная документация:
namespace AppBundle\Controller; use Symfony\Bundle\TwigBundle\Controller\ExceptionController as Controller; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Component\HttpKernel\Exception\FlattenException; use Symfony\Component\HttpKernel\Log\DebugLoggerInterface; use AppBundle\Exception\ExceptionHandler; class ExceptionController extends Controller { public function __construct(ExceptionHandler $handler) { $this->handler = $handler; } public function showAction(Request $request, FlattenException $exception, DebugLoggerInterface $logger = null) { $message = $this->handler->handle($exception)->getMessage(); return new JsonResponse(array( 'message' => $message )); } }
Далее создадим сервис, который занимается обработкой исключений:
namespace AppBundle\Exception; use Symfony\Component\Security\Core\Exception\AccessDeniedException; class ExceptionHandler { private $message = null; public function handle($exception) { switch($exception->getClass()) { case 'Symfony\Component\Security\Core\Exception\InsufficientAuthenticationException' : $this->message = "Need full authentication"; break; case 'Symfony\Component\Security\Core\Exception\AccessDeniedException': $this->message = "Access Denied"; break; /** * Указываем действия для всех нужных исключений **/ default: break; } return $this; } public function getMessage() { return $this->message; } }
Теперь регистрируем наш сервис:
# services.yml app_bundle.exception.handler: class: AppBundle\Exception\ExceptionHandler
Далее регистрируем наш контроллер как сервис(не забываем передать в него Exception Handler):
# services.yml app_bundle.exception.controller: class: AppBundle\Controller\ExceptionController arguments: - @app_bundle.exception.handler
Осталось самое главное: указать в config.yml, что исключения обрабатывает именно наш контроллер:
# config.yml # Twig Configuration twig: exception_controller: app_bundle.exception.controller:showAction
Надеюсь на вашу конструктивную критику, а также на то, что для кого-то эта статья окажется полезной.
ссылка на оригинал статьи https://habrahabr.ru/post/276155/
Добавить комментарий