From cccb66f4c6aef7f5a08d622df4277f7c884b667f Mon Sep 17 00:00:00 2001 From: Chris Wilkinson Date: Mon, 18 Jun 2018 08:55:09 +0100 Subject: [PATCH] [TwigBundle][DX] Only add the Twig WebLinkExtension if the WebLink component is enabled --- .../Bridge/Twig/UndefinedCallableHandler.php | 23 ++++++++++++++++--- .../Compiler/ExtensionPass.php | 4 ++++ .../DependencyInjection/TwigExtension.php | 9 -------- .../TwigBundle/Resources/config/twig.xml | 4 ++++ 4 files changed, 28 insertions(+), 12 deletions(-) diff --git a/src/Symfony/Bridge/Twig/UndefinedCallableHandler.php b/src/Symfony/Bridge/Twig/UndefinedCallableHandler.php index 77c78ce38f53..c81d1cac7d3d 100644 --- a/src/Symfony/Bridge/Twig/UndefinedCallableHandler.php +++ b/src/Symfony/Bridge/Twig/UndefinedCallableHandler.php @@ -11,6 +11,7 @@ namespace Symfony\Bridge\Twig; +use Symfony\Bundle\FullStack; use Twig\Error\SyntaxError; /** @@ -55,14 +56,21 @@ class UndefinedCallableHandler 'workflow_marked_places' => 'workflow', ); + private static $fullStackEnable = array( + 'form' => 'enable "framework.form"', + 'security-core' => 'add the "SecurityBundle"', + 'security-http' => 'add the "SecurityBundle"', + 'web-link' => 'enable "framework.web_link"', + 'workflow' => 'enable "framework.workflows"', + ); + public static function onUndefinedFilter($name) { if (!isset(self::$filterComponents[$name])) { return false; } - // Twig will append the source context to the message, so that it will end up being like "[...] Unknown filter "%s" in foo.html.twig on line 123." - throw new SyntaxError(sprintf('Did you forget to run "composer require symfony/%s"? Unknown filter "%s".', self::$filterComponents[$name], $name)); + self::onUndefined($name, 'filter', self::$filterComponents[$name]); } public static function onUndefinedFunction($name) @@ -71,6 +79,15 @@ public static function onUndefinedFunction($name) return false; } - throw new SyntaxError(sprintf('Did you forget to run "composer require symfony/%s"? Unknown function "%s".', self::$functionComponents[$name], $name)); + self::onUndefined($name, 'function', self::$functionComponents[$name]); + } + + private static function onUndefined($name, $type, $component) + { + if (\class_exists(FullStack::class) && isset(self::$fullStackEnable[$component])) { + throw new SyntaxError(sprintf('Did you forget to %s? Unknown %s "%s".', self::$fullStackEnable[$component], $type, $name)); + } + + throw new SyntaxError(sprintf('Did you forget to run "composer require symfony/%s"? Unknown %s "%s".', $component, $type, $name)); } } diff --git a/src/Symfony/Bundle/TwigBundle/DependencyInjection/Compiler/ExtensionPass.php b/src/Symfony/Bundle/TwigBundle/DependencyInjection/Compiler/ExtensionPass.php index a4e8c944c92a..0ca55f298ee8 100644 --- a/src/Symfony/Bundle/TwigBundle/DependencyInjection/Compiler/ExtensionPass.php +++ b/src/Symfony/Bundle/TwigBundle/DependencyInjection/Compiler/ExtensionPass.php @@ -82,6 +82,10 @@ public function process(ContainerBuilder $container) } } + if ($container->has('web_link.add_link_header_listener')) { + $container->getDefinition('twig.extension.weblink')->addTag('twig.extension'); + } + $twigLoader = $container->getDefinition('twig.loader.native_filesystem'); if ($container->has('templating')) { $loader = $container->getDefinition('twig.loader.filesystem'); diff --git a/src/Symfony/Bundle/TwigBundle/DependencyInjection/TwigExtension.php b/src/Symfony/Bundle/TwigBundle/DependencyInjection/TwigExtension.php index c3012abbd8e5..1ca688e6b969 100644 --- a/src/Symfony/Bundle/TwigBundle/DependencyInjection/TwigExtension.php +++ b/src/Symfony/Bundle/TwigBundle/DependencyInjection/TwigExtension.php @@ -11,7 +11,6 @@ namespace Symfony\Bundle\TwigBundle\DependencyInjection; -use Symfony\Bridge\Twig\Extension\WebLinkExtension; use Symfony\Component\Config\FileLocator; use Symfony\Component\Config\Resource\FileExistenceResource; use Symfony\Component\Console\Application; @@ -19,7 +18,6 @@ use Symfony\Component\DependencyInjection\Reference; use Symfony\Component\DependencyInjection\Loader\XmlFileLoader; use Symfony\Component\HttpKernel\DependencyInjection\Extension; -use Symfony\Component\WebLink\HttpHeaderSerializer; use Twig\Extension\ExtensionInterface; use Twig\Extension\RuntimeExtensionInterface; use Twig\Loader\LoaderInterface; @@ -60,13 +58,6 @@ public function load(array $configs, ContainerBuilder $container) $container->removeDefinition('twig.translation.extractor'); } - if (class_exists(HttpHeaderSerializer::class)) { - $definition = $container->register('twig.extension.weblink', WebLinkExtension::class); - $definition->setPublic(false); - $definition->addArgument(new Reference('request_stack')); - $definition->addTag('twig.extension'); - } - foreach ($configs as $key => $config) { if (isset($config['globals'])) { foreach ($config['globals'] as $name => $value) { diff --git a/src/Symfony/Bundle/TwigBundle/Resources/config/twig.xml b/src/Symfony/Bundle/TwigBundle/Resources/config/twig.xml index fca4367ba743..5d014e930c53 100644 --- a/src/Symfony/Bundle/TwigBundle/Resources/config/twig.xml +++ b/src/Symfony/Bundle/TwigBundle/Resources/config/twig.xml @@ -114,6 +114,10 @@ + + + +