Symfony:如何在Twig模板中引用自定义Bundle视图目录的文件路径?
解决Twig模板JS中引用Bundle内部模板路径的问题
你遇到的问题很典型——直接在JS里写ContentbuildBundle:Template:theme.html.twig这种Symfony内部模板命名是行不通的,因为浏览器根本识别不了这种格式,它需要的是可以直接访问的公开URL,而不是Symfony的内部模板标识。
下面给你两种可行的解决方案,根据你的模板情况选择:
方案一:通过控制器暴露模板的访问URL(推荐,支持Twig逻辑)
如果你的theme.html.twig里包含Twig变量或逻辑,必须用这种方法:
- 创建控制器动作
在你的ContentbuildBundle里新建一个控制器,用来渲染这个模板:
// src/ContentbuildBundle/Controller/TemplateController.php namespace ContentbuildBundle\Controller; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\Response; class TemplateController extends AbstractController { public function themeAction() { return $this->render('ContentbuildBundle:Template:theme.html.twig'); } }
- 配置路由
在ContentbuildBundle的路由配置文件里(比如src/ContentbuildBundle/Resources/config/routing.yml)添加路由规则:
contentbuild_template_theme: path: /contentbuild/theme defaults: { _controller: ContentbuildBundle:Template:theme }
- 在Twig的JS中引用路由URL
用Symfony的path()函数生成这个路由的公开URL,替换原来的模板路径:
jQuery(document).ready(function ($) { $("#content").builder({ themeFile: '{{ path('contentbuild_template_theme') }}', toolbar: 'right', onRender: function() { $('#contentarea').trigger('focusout'); } }); });
方案二:将模板复制到公开目录(仅适用于纯HTML模板)
如果theme.html.twig是没有Twig逻辑的纯HTML文件,可以把它复制到web/bundles/contentbuild/template/目录下(需要先确保你的Bundle资源已经通过assets:install命令发布到web目录),然后用asset()函数引用:
jQuery(document).ready(function ($) { $("#content").builder({ themeFile: '{{ asset('bundles/contentbuild/template/theme.html') }}', toolbar: 'right', onRender: function() { $('#contentarea').trigger('focusout'); } }); });
简单总结下:第一种方法是通用解决方案,不管模板有没有Twig逻辑都能用;第二种方法更简单,但只适合纯静态的HTML文件。
内容的提问来源于stack exchange,提问作者Theva
相关产品推荐
相关产品推荐

