是否可以包含{% include %}
的模板,该模板位于以下定义的模板路径之外:
$template = $twig->loadTemplate('example.tpl');
我问它,因为这条线不起作用:
{% include '.../example/navbar_left.tpl' %}
答案 0 :(得分:4)
不,使用Twig_Loader_Filesystem
是不可能的,因为它明确拒绝内部有..
的模板名称。这可以在文件validateName($name)
内的函数Twig/lib/Twig/Loader/Filesystem.php
的定义中得到验证。
如果您需要访问路径外的模板,我能想到的唯一干净解决方案是create your own loader。
确实有效的解决方法是在实际向Twig_Loader_Filesystem
注册的文件夹中定义符号链接,指向您要访问的目录。使用此方法小心,将链接指向安全的地方。
答案 1 :(得分:4)
您可以通过以下方式添加更多路径: https://symfony.com/doc/3.4/templating/namespaced_paths.html
config.yml
# Twig Configuration
twig:
paths:
'%kernel.root_dir%/../src/AppBundle/Resources/views': AppBundle
'%kernel.root_dir%/../web/': 'WEB_DIR_DIST' #your new custom path
someFile.html.twig
<script>{{ source('@WEB_DIR_DIST' ~ 'custom.js') }}</script>
答案 2 :(得分:3)
您可以将路径添加到Twig加载程序(Filesystem loader) 看到Fabien的最后回复(addPath方法是你需要的) https://github.com/symfony/symfony/issues/1912
答案 3 :(得分:1)
您可以将第二条路径添加到您的twig.yaml(symfony 4.4)
twig:
paths:
- '%kernel.project_dir%/templates'
- '%kernel.project_dir%/example'
然后只使用名称{% include 'navbar_left.tpl' %}
答案 4 :(得分:0)
可以通过符号链接。
来自src/AppBundle/Resources/views/Admin
Ubuntu:
ln -s ./../../../../../web/admin/_index-import-body.html index-import-body.html.twig
Windows:
mklink index-import-body.html.twig ./../../../../../web/admin/_index-import-body.html
然后总是将index-import-body.html.twig
包含在树枝文件中
{% include '@App/Admin/index-import-body.html.twig' %}