动态可解析的Twig名称空间

时间:2019-04-04 15:17:22

标签: php symfony twig symfony4

我有一个Symfony应用程序,可以处理来自多个域的请求。在这些域上,客户可以创建可在其CMS模块中使用的自定义Twig模板。这些模板将保存到/path/to/ftp/example.com/cms_templates/目录中。

在早期版本的Symfony中,渲染这些模板不是问题。根据mydomain.com/page_one上的传入请求,可以将Twig模板的绝对路径解析为例如/path/to/ftp/mydomain.com/cms_templates/page_one.html.twig。验证模板的存在并渲染模板。但是,在Symfony 4中,对绝对模板路径has been removed的支持。

我想到了twig.paths中的registering an extra Twig namespace,称为“ custom”,它指向/path/to/ftp,然后使用@custom/mydomain.com/cms_templates/page_one.html.twig引用模板。问题是,/path/to/ftp不仅包含模板,还包含其他文件的加载和加载。然后,TemplateCacheWarmer遍历所有这些文件。

我实际上正在寻找的是一种注册Twig命名空间(例如@cms)的方法,该命名空间可以即时解析,以便可以在其中注入当前请求的主机名。然后,我将能够使用@cms\page_one.html.twig引用模板。这些模板不需要进行缓存预热。

如何实现这种功能?我查看了Twig文档,但似乎无法弄清。

TLDR; domain.com 在请求之间不同时,如何使Symfony / Twig将模板@foo\template.html.twig解析为/path/to/domain.com/templates/template.html.twig

1 个答案:

答案 0 :(得分:0)

一种解决方案是prepend configuration

   public function prepend(ContainerBuilder $container)
    {
        $bundles = $container->getParameter('kernel.bundles');

        if (isset($bundles['TwigBundle'])) {

            $config = $container->getExtensionConfig('twig')[0];
            $paths = ['/path/to/cms' => 'cms'];

            if (array_key_exists('path', $config)) {
                $paths = array_merge($config['paths'], $paths);
            }

            $config['paths'] = $paths;

            $container->prependExtensionConfig('twig', $config);
        }
    }

问题是这样的:

more then one bundle

如果您正在构建某种 CMS - 那么这意味着 - 没有其他包/模块/插件可以再次注册额外的树枝命名空间 - 如果我是对的。

所以...如果有其他解决方案,我对其他解决方案感兴趣。