
Creating a 404 error page in symfony (creating a controller)
I have already created an "AppBundle" bundle and there is a controller folder in which there will be controllers. We register the controller in services config.yml, write the settings and the path to the controller:
# This should be written in symfony 2.2 !!! and higher twig: exception_controller: my.twig.controller.exception:showAction # This should be written in symfony 2.1 version !!! twig: exception_controller: AppBundle\Controller\ExceptionController:showAction services: my.twig.controller.exception: class: AppBundle\Controller\ExceptionController arguments: ['@twig', '%kernel.debug%', '@service_container']
Where class we write the path to our class, the controller, which we will then create in the bundle:
And we specify the function in the controller ExceptionController, which will work on page transition: :showAction
The controller itself is referenced in the specified twig parameters by the name of the service:
In the arguments, I wrote the input parameters to the construction of the ExceptionController class:
After we have registered the paths and settings for the controller in yml, we proceed to creating the ExceptionController itself along the path AppBundle\Controller :
namespace FrontBundle\Controller; use Symfony\Component\Debug\Exception\FlattenException; use Symfony\Component\HttpKernel\Log\DebugLoggerInterface; use Symfony\Component\HttpFoundation\Response; use Symfony\Bundle\TwigBundle\Controller\ExceptionController as BaseExceptionController; use Symfony\Component\HttpFoundation\Request; use Twig\Environment; class ExceptionController extends BaseExceptionController { private $container; public function __construct(Environment $twig, $debug, $container) { parent::__construct($twig, $debug); $this->container = $container; } public function showAction(Request $request, FlattenException $exception, DebugLoggerInterface $logger = null, $format = 'html') { $currentContent = $this->getAndCleanOutputBuffering($request->headers->get('X-Php-Ob-Level', -1)); $showException = $request->attributes->get('showException', $this->debug); // As opposed to an additional $code = $exception->getStatusCode(); if($code != '404' && $code == ''){ $code = '404'; } $responce = new Response($this->twig->render( '@Front/Exception/error'.$code.'.html.twig', [ 'status_code' => $code, 'status_text' => isset(Response::$statusTexts[$code]) ? Response::$statusTexts[$code] : '', 'exception' => $exception, 'logger' => $logger, 'currentContent' => $currentContent, ] ), 200, ['Content-Type' => $request->getMimeType($request->getRequestFormat()) ?: 'text/html']); return $responce; } }
To display a 404 error, specify the path to the template @Front/Exception/error'.$code.'.html.twig and pass the variables there
That's all, now when you switch to not not correct page this controller fires