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 @@
+
+
+
+