phpsymfonytwigoverridingmicrokernel

How to override bundle resources in micro-kernel Symfony?


I've got micro-kernel Symfony project with custom catalog structure.

I used this: https://github.com/ikoene/symfony-micro

How can I override e.g. Twig Resources (Exception views)?

Cookbook says that I should create a directory called TwigBundle in my Resources directory.

I made \AppBundle\Resources\TwigBundle\views\Exception directory. Overriding view does not seem to work.


Solution

  • Thanks for using the microkernel setup. Here's how to override exception views.

    1. Create a custom ExceptionController

    First off, we're gonna create our own ExceptionController which extends the base ExceptionController. This will allow us to overwrite the template path.

        <?php
    
        namespace AppBundle\Controller\Exception;
    
        use Symfony\Bundle\TwigBundle\Controller\ExceptionController as BaseExceptionController;
        use Symfony\Component\HttpFoundation\Request;
    
        class ExceptionController extends BaseExceptionController
        {
            /**
              * @param Request $request
              * @param string $format
              * @param int $code
              * @param bool $showException
              *
              * @return string
              */
             protected function findTemplate(Request $request, $format, $code, $showException)
             {
                 $name = $showException ? 'exception' : 'error';
                 if ($showException && 'html' == $format) {
                     $name = 'exception_full';
                 }
    
                 // For error pages, try to find a template for the specific HTTP status code and format
                 if (!$showException) {
                     $template = sprintf('AppBundle:Exception:%s%s.%s.twig', $name, $code, $format);
                     if ($this->templateExists($template)) {
                         return $template;
                     }
                 }
    
                 // try to find a template for the given format
                 $template = sprintf('@Twig/Exception/%s.%s.twig', $name, $format);
                 if ($this->templateExists($template)) {
                     return $template;
                 }
    
                 // default to a generic HTML exception
                 $request->setRequestFormat('html');
    
                 return sprintf('@Twig/Exception/%s.html.twig', $showException ? 'exception_full' : $name);
             }
        }
    

    2. Create the error templates

    Create templates for the different error codes:

    In this example, the exception templates would be placed in AppBundle/Resources/views/Exception/

    3. Override the default ExceptionController

    Now let's point to our new exception controller in the configuration.

    twig: exception_controller: app.exception_controller:showAction