我有一个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
。>
答案 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);
}
}
问题是这样的:
如果您正在构建某种 CMS - 那么这意味着 - 没有其他包/模块/插件可以再次注册额外的树枝命名空间 - 如果我是对的。
所以...如果有其他解决方案,我对其他解决方案感兴趣。