1

我写了一个自定义的 DatabaseTwigLoader,基于这个配方:http ://twig.sensiolabs.org/doc/recipes.html#using-a-database-to-store-templates

它工作正常。我正在使用这个加载器从数据库加载电子邮件模板,渲染它们并使用 swift mailer 发送它们。

问题是,在渲染模板时,我不能使用路径或 url 树枝函数。返回的错误是:

第 6 行的“NEW_POST_ON_YOUR_GOAL”中不存在函数“路径”(500 内部服务器错误)

然而,变量插值和过滤器被应用并且模板继承工作。

我需要用自定义加载器注册 url / path 函数吗?这些功能依赖于路由是否与此有关?

提前致谢。

** @MolecularMan 建议的解决方案的实施**

我必须将路由扩展添加到 twigEnvironment。我使用 TwigEnvironment::addExtension() 方法做到了这一点。

为了使用 DI 实现这一点,我必须扩展 urlGenerator 类(作为构造函数参数传递给 routing_extension 服务)。

UrlGenerator 将 routeCollection 对象作为构造函数参数。所以我将路由器服务作为构造函数参数传递给我的扩展 urlGenerator,以便我可以提取 routecollection 并将其传递给 parent::__contruct()

为了使用 DI 实现这一点,我必须扩展 urlGenerator 类(作为构造函数参数传递给 routing_extension 服务)。

UrlGenerator 将 routeCollection 对象作为构造函数参数。所以我将路由器服务作为构造函数参数传递给我的扩展 urlGenerator,以便我可以提取 routecollection 并将其传递给 parent::__contruct()

我的 services.yml 文件如下所示:

twig_db:
    class: %twig.class%
    arguments: [@twig_db_loader]
    calls: [[ addExtension, [@routing_extension] ]]
url_generator:
    class: ZT\UserBundle\Services\UrlGenerator
    arguments: [@router, @request_context, @logger]
request_context:
    class: Symfony\Component\Routing\RequestContext
routing_extension:
    class: Symfony\Bridge\Twig\Extension\RoutingExtension
    arguments: [@url_generator]
twig_db_loader:
    class: ZT\UserBundle\Services\DatabaseTwigLoader
    arguments: [@doctrine.orm.entity_manager]
4

1 回答 1

0

您应该注册 RoutingExtension:

$loader = new \Twig_Loader_Filesystem(array(__DIR__ . '/../../Resources/views'));
$twig = new \Twig_Environment($loader);

$twig->addExtension(new RoutingExtension($this->getMock('Symfony\Component\Routing\Generator\UrlGeneratorInterface')));
$twig->render('your_view.html.twig');
于 2015-05-18T19:14:45.447 回答