diff --git a/core/core.services.yml b/core/core.services.yml index 7cdd453..8d34874 100644 --- a/core/core.services.yml +++ b/core/core.services.yml @@ -1044,10 +1044,9 @@ services: class: Drupal\Core\Extension\InfoParser twig: class: Drupal\Core\Template\TwigEnvironment - arguments: ['@twig.loader_chain', '@module_handler', '@theme_handler', '%twig.config%'] + arguments: ['@twig.loader', '@module_handler', '@theme_handler', '%twig.config%'] tags: - { name: service_collector, tag: 'twig.extension', call: addExtension } - - { name: service_collector, tag: 'twig.loader', call: addLoader } twig.extension: class: Drupal\Core\Template\TwigExtension tags: @@ -1061,10 +1060,8 @@ services: class: Twig_Extension_Debug tags: - { name: twig.extension } - twig.loader_chain: + twig.loader.chain: class: Twig_Loader_Chain - twig.loader: - alias: twig.loader.filesystem twig.loader.filesystem: class: Twig_Loader_Filesystem arguments: ['%app.root%'] diff --git a/core/lib/Drupal/Core/CoreServiceProvider.php b/core/lib/Drupal/Core/CoreServiceProvider.php index db54f91..cd2c93f 100644 --- a/core/lib/Drupal/Core/CoreServiceProvider.php +++ b/core/lib/Drupal/Core/CoreServiceProvider.php @@ -19,6 +19,7 @@ use Drupal\Core\DependencyInjection\Compiler\RegisterKernelListenersPass; use Drupal\Core\DependencyInjection\Compiler\RegisterAccessChecksPass; use Drupal\Core\DependencyInjection\Compiler\RegisterServicesForDestructionPass; +use Drupal\Core\DependencyInjection\Compiler\TwigLoaderPass; use Drupal\Core\Plugin\PluginManagerPass; use Symfony\Component\DependencyInjection\Compiler\PassConfig; @@ -57,6 +58,7 @@ public function register(ContainerBuilder $container) { // Collect tagged handler services as method calls on consumer services. $container->addCompilerPass(new TaggedHandlersPass()); $container->addCompilerPass(new RegisterStreamWrappersPass()); + $container->addCompilerPass(new TwigLoaderPass()); // Add a compiler pass for registering event subscribers. $container->addCompilerPass(new RegisterKernelListenersPass(), PassConfig::TYPE_AFTER_REMOVING); diff --git a/core/lib/Drupal/Core/DependencyInjection/Compiler/TwigLoaderPass.php b/core/lib/Drupal/Core/DependencyInjection/Compiler/TwigLoaderPass.php new file mode 100644 index 0000000..0b7f38c --- /dev/null +++ b/core/lib/Drupal/Core/DependencyInjection/Compiler/TwigLoaderPass.php @@ -0,0 +1,50 @@ +hasDefinition('twig')) { + return; + } + + // Register additional template loaders. + $loaderIds = $container->findTaggedServiceIds('twig.loader'); + + if (count($loaderIds) === 0) { + throw new LogicException('No twig loaders found. You need to tag at least one loader with "twig.loader"'); + } + + if (count($loaderIds) === 1) { + $container->setAlias('twig.loader', key($loaderIds)); + } + else { + $chainLoader = $container->getDefinition('twig.loader.chain'); + foreach (array_keys($loaderIds) as $id) { + $chainLoader->addMethodCall('addLoader', array(new Reference($id))); + } + $container->setAlias('twig.loader', 'twig.loader.chain'); + } + } + +} diff --git a/core/lib/Drupal/Core/Template/TwigEnvironment.php b/core/lib/Drupal/Core/Template/TwigEnvironment.php index 67d461a..184272d 100644 --- a/core/lib/Drupal/Core/Template/TwigEnvironment.php +++ b/core/lib/Drupal/Core/Template/TwigEnvironment.php @@ -56,7 +56,7 @@ public function __construct(\Twig_LoaderInterface $loader = NULL, ModuleHandlerI if (file_exists($templatesDirectory)) { // @todo Inject this? Might be weird injecting two TwigLoaderInterface? // Or solve this another way. - \Drupal::service('twig.loader')->addPath($templatesDirectory, $name); + \Drupal::service('twig.loader.filesystem')->addPath($templatesDirectory, $name); } } @@ -213,16 +213,4 @@ public function renderInline($template_string, array $context = array()) { return $this->loadTemplate($template_string, NULL)->render($context); } - /** - * Adds a new loader to the Twig environment. - * - * @param Twig_LoaderInterface $loader A Loader instance - */ - public function addLoader(\Twig_LoaderInterface $loader) { - if ($this->extensionInitialized) { - throw new \LogicException('Unable to add a loader as extensions have already been initialized.'); - } - $this->loader->addLoader($loader); - } - }