[FrameworkBundle] TemplateController should accept extra arguments to be sent to the template

This commit is contained in:
Benjamin RICHARD 2020-01-08 11:51:46 +01:00 committed by Fabien Potencier
parent 20bf17f6ad
commit e27b417817
3 changed files with 30 additions and 8 deletions

View File

@ -8,6 +8,7 @@ CHANGELOG
* Added a new `mailer.message_bus` option to configure or disable the message bus to use to send mails. * Added a new `mailer.message_bus` option to configure or disable the message bus to use to send mails.
* Added flex-compatible default implementations for `MicroKernelTrait::registerBundles()` and `getProjectDir()` * Added flex-compatible default implementations for `MicroKernelTrait::registerBundles()` and `getProjectDir()`
* Deprecated passing a `RouteCollectionBuiler` to `MicroKernelTrait::configureRoutes()`, type-hint `RoutingConfigurator` instead * Deprecated passing a `RouteCollectionBuiler` to `MicroKernelTrait::configureRoutes()`, type-hint `RoutingConfigurator` instead
* The `TemplateController` now accepts context argument
5.0.0 5.0.0
----- -----

View File

@ -33,18 +33,19 @@ class TemplateController
/** /**
* Renders a template. * Renders a template.
* *
* @param string $template The template name * @param string $template The template name
* @param int|null $maxAge Max age for client caching * @param int|null $maxAge Max age for client caching
* @param int|null $sharedAge Max age for shared (proxy) caching * @param int|null $sharedAge Max age for shared (proxy) caching
* @param bool|null $private Whether or not caching should apply for client caches only * @param bool|null $private Whether or not caching should apply for client caches only
* @param array $context The context (arguments) of the template
*/ */
public function templateAction(string $template, int $maxAge = null, int $sharedAge = null, bool $private = null): Response public function templateAction(string $template, int $maxAge = null, int $sharedAge = null, bool $private = null, array $context = []): Response
{ {
if (null === $this->twig) { if (null === $this->twig) {
throw new \LogicException('You can not use the TemplateController if the Twig Bundle is not available.'); throw new \LogicException('You can not use the TemplateController if the Twig Bundle is not available.');
} }
$response = new Response($this->twig->render($template)); $response = new Response($this->twig->render($template, $context));
if ($maxAge) { if ($maxAge) {
$response->setMaxAge($maxAge); $response->setMaxAge($maxAge);
@ -63,8 +64,8 @@ class TemplateController
return $response; return $response;
} }
public function __invoke(string $template, int $maxAge = null, int $sharedAge = null, bool $private = null): Response public function __invoke(string $template, int $maxAge = null, int $sharedAge = null, bool $private = null, array $context = []): Response
{ {
return $this->templateAction($template, $maxAge, $sharedAge, $private); return $this->templateAction($template, $maxAge, $sharedAge, $private, $context);
} }
} }

View File

@ -13,6 +13,8 @@ namespace Symfony\Bundle\FrameworkBundle\Tests\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\TemplateController; use Symfony\Bundle\FrameworkBundle\Controller\TemplateController;
use Symfony\Bundle\FrameworkBundle\Tests\TestCase; use Symfony\Bundle\FrameworkBundle\Tests\TestCase;
use Twig\Environment;
use Twig\Loader\ArrayLoader;
/** /**
* @author Kévin Dunglas <dunglas@gmail.com> * @author Kévin Dunglas <dunglas@gmail.com>
@ -39,4 +41,22 @@ class TemplateControllerTest extends TestCase
$controller->templateAction('mytemplate')->getContent(); $controller->templateAction('mytemplate')->getContent();
$controller('mytemplate')->getContent(); $controller('mytemplate')->getContent();
} }
public function testContext()
{
$templateName = 'template_controller.html.twig';
$context = [
'param' => 'hello world',
];
$expected = '<h1>'.$context['param'].'</h1>';
$loader = new ArrayLoader();
$loader->setTemplate($templateName, '<h1>{{param}}</h1>');
$twig = new Environment($loader);
$controller = new TemplateController($twig);
$this->assertEquals($expected, $controller->templateAction($templateName, null, null, null, $context)->getContent());
$this->assertEquals($expected, $controller($templateName, null, null, null, $context)->getContent());
}
} }