From be5a208c391a06858d1692b0b8f07a643a5d3dca Mon Sep 17 00:00:00 2001 From: Fabien Potencier Date: Sat, 10 Jan 2015 11:33:00 +0100 Subject: [PATCH] decoupled global variables system in Twig from the Templating one --- .../Templating/GlobalVariables.php | 2 +- src/Symfony/Bundle/TwigBundle/AppVariable.php | 160 ++++++++++++++++++ .../TwigBundle/Resources/config/twig.xml | 10 +- .../DependencyInjection/TwigExtensionTest.php | 2 +- src/Symfony/Bundle/TwigBundle/composer.json | 2 +- 5 files changed, 172 insertions(+), 4 deletions(-) create mode 100644 src/Symfony/Bundle/TwigBundle/AppVariable.php diff --git a/src/Symfony/Bundle/FrameworkBundle/Templating/GlobalVariables.php b/src/Symfony/Bundle/FrameworkBundle/Templating/GlobalVariables.php index 51fe53f2e0ba..c2a2c7888c8b 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Templating/GlobalVariables.php +++ b/src/Symfony/Bundle/FrameworkBundle/Templating/GlobalVariables.php @@ -18,7 +18,7 @@ use Symfony\Component\Security\Core\SecurityContext; /** - * GlobalVariables is the entry point for Symfony global variables in Twig templates. + * GlobalVariables is the entry point for Symfony global variables in PHP templates. * * @author Fabien Potencier */ diff --git a/src/Symfony/Bundle/TwigBundle/AppVariable.php b/src/Symfony/Bundle/TwigBundle/AppVariable.php new file mode 100644 index 000000000000..f40cba5cd1b7 --- /dev/null +++ b/src/Symfony/Bundle/TwigBundle/AppVariable.php @@ -0,0 +1,160 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Bundle\TwigBundle; + +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpFoundation\RequestStack; +use Symfony\Component\HttpFoundation\Session\Session; +use Symfony\Component\Security\Core\Authentication\Token\TokenInterface; +use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface; +use Symfony\Component\Security\Core\SecurityContextInterface; + +/** + * Exposes some Symfony parameters and services as an "app" global variable. + * + * @author Fabien Potencier + */ +class AppVariable +{ + private $security; + private $tokenStorage; + private $requestStack; + private $environment; + private $debug; + + /** + * @deprecated since version 2.7, to be removed in 3.0. + */ + public function setSecurity(SecurityContextInterface $security) + { + $this->security = $security; + } + + public function setTokenStorage(TokenStorageInterface $tokenStorage) + { + $this->tokenStorage = $tokenStorage; + } + + public function setRequestStack(RequestStack $requestStack) + { + $this->requestStack = $requestStack; + } + + public function setEnvironment($environment) + { + $this->environment = $environment; + } + + public function setDebug($debug) + { + $this->debug = (bool) $debug; + } + + /** + * Returns the security context service. + * + * @deprecated since version 2.6, to be removed in 3.0. + * + * @return SecurityContext|null The security context + */ + public function getSecurity() + { + trigger_error('The "app.security" variable is deprecated since version 2.6 and will be removed in 3.0.', E_USER_DEPRECATED); + + if (null === $this->security) { + throw new \RuntimeException('The "app.security" variable is not available.'); + } + + return $this->security; + } + + /** + * Returns the current user. + * + * @return mixed + * + * @see TokenInterface::getUser() + */ + public function getUser() + { + if (null === $this->tokenStorage) { + throw new \RuntimeException('The "app.user" variable is not available.'); + } + + if (!$token = $this->tokenStorage->getToken()) { + return; + } + + $user = $token->getUser(); + if (is_object($user)) { + return $user; + } + } + + /** + * Returns the current request. + * + * @return Request|null The HTTP request object + */ + public function getRequest() + { + if (null === $this->requestStack) { + throw new \RuntimeException('The "app.request" variable is not available.'); + } + + return $this->requestStack->getCurrentRequest(); + } + + /** + * Returns the current session. + * + * @return Session|null The session + */ + public function getSession() + { + if (null === $this->requestStack) { + throw new \RuntimeException('The "app.session" variable is not available.'); + } + + if ($request = $this->getRequest()) { + return $request->getSession(); + } + } + + /** + * Returns the current app environment. + * + * @return string The current environment string (e.g 'dev') + */ + public function getEnvironment() + { + if (null === $this->environment) { + throw new \RuntimeException('The "app.environment" variable is not available.'); + } + + return $this->environment; + } + + /** + * Returns the current app debug mode. + * + * @return bool The current debug mode + */ + public function getDebug() + { + if (null === $this->debug) { + throw new \RuntimeException('The "app.debug" variable is not available.'); + } + + return $this->debug; + } +} diff --git a/src/Symfony/Bundle/TwigBundle/Resources/config/twig.xml b/src/Symfony/Bundle/TwigBundle/Resources/config/twig.xml index 40dbaa9fbbf2..b0a7223287d3 100644 --- a/src/Symfony/Bundle/TwigBundle/Resources/config/twig.xml +++ b/src/Symfony/Bundle/TwigBundle/Resources/config/twig.xml @@ -34,10 +34,18 @@ %twig.options% app - + + + %kernel.environment% + %kernel.debug% + + + + + diff --git a/src/Symfony/Bundle/TwigBundle/Tests/DependencyInjection/TwigExtensionTest.php b/src/Symfony/Bundle/TwigBundle/Tests/DependencyInjection/TwigExtensionTest.php index 05d450db73a3..9709059caf74 100644 --- a/src/Symfony/Bundle/TwigBundle/Tests/DependencyInjection/TwigExtensionTest.php +++ b/src/Symfony/Bundle/TwigBundle/Tests/DependencyInjection/TwigExtensionTest.php @@ -99,7 +99,7 @@ public function testLoadFullConfiguration($format) // Globals $calls = $container->getDefinition('twig')->getMethodCalls(); $this->assertEquals('app', $calls[0][1][0], '->load() registers services as Twig globals'); - $this->assertEquals(new Reference('templating.globals'), $calls[0][1][1]); + $this->assertEquals(new Reference('twig.app_variable'), $calls[0][1][1]); $this->assertEquals('foo', $calls[1][1][0], '->load() registers services as Twig globals'); $this->assertEquals(new Reference('bar'), $calls[1][1][1], '->load() registers services as Twig globals'); $this->assertEquals('baz', $calls[2][1][0], '->load() registers variables as Twig globals'); diff --git a/src/Symfony/Bundle/TwigBundle/composer.json b/src/Symfony/Bundle/TwigBundle/composer.json index b1e51bd7262b..7a141e064448 100644 --- a/src/Symfony/Bundle/TwigBundle/composer.json +++ b/src/Symfony/Bundle/TwigBundle/composer.json @@ -28,7 +28,7 @@ "symfony/config": "~2.2|~3.0.0", "symfony/routing": "~2.1|~3.0.0", "symfony/templating": "~2.1|~3.0.0", - "symfony/framework-bundle": "~2.1|~3.0.0" + "symfony/framework-bundle": "~2.7|~3.0.0" }, "autoload": { "psr-0": { "Symfony\\Bundle\\TwigBundle\\": "" }