【问题标题】:How to add a local Twig extension from a controller如何从控制器添加本地 Twig 扩展
【发布时间】:2016-05-07 19:38:02
【问题描述】:

我有一个非常专业的过滤器,我想将其用于单个页面,而不是使其成为全局过滤器。我试过这样做(这不是我想要的功能,这只是一个测试):

$this->get('twig')
    ->addFilter(new \Twig_SimpleFilter('chgname', function ($string) {
        return substr($string, 0, 5);
    }));

但我收到错误消息“无法添加过滤器,因为扩展已经初始化”。

我知道我可以在 AppBundle/Twig 目录中创建一个类并将其添加为服务,但是 1)它非常繁重,而且 PITA 仅用于我需要的一个简单过滤器,并且 2)它使其全局整个应用程序,这对于我在本地需要的东西来说是愚蠢的。

有什么办法可以做到这一点,还是我只坚持全局扩展?提前致谢。

【问题讨论】:

  • 如果你想在本地做,只需在控制器中使用substr()并将结果传递给twig。
  • 他说这不是他想要的功能。不过,我不得不问 op,在你的包/应用程序中全局使用它有什么问题?这是正确的做法,它不重,是否“全球”有什么关系?
  • 只能在控制器中完成一页的功能,我认为为此制作树枝过滤器没有意义。过滤器适用于可重用的用例。
  • 所以,只要做那个过滤器,不要问你知道答案的问题。
  • 好吧,我不知道答案,这就是我问的原因。不过,我真的没想到人们会尝试证明全局变量是任何人都应该需要的。

标签: symfony filter twig local twig-extension


【解决方案1】:

Twig 在您的应用启动时加载一个环境,您无法动态更改它。

如果你认为 Symfony 太重,你仍然可以看看 Silex(它使用 Symfony 组件),这样你就可以编写如下内容:

$app['twig'] = $app->extend('twig', function ($twig) {
    $twig->addFilter(new \Twig_SimpleFilter('chgname', function ($string) {
        return substr($string, 0, 5);
    }));

    return $twig;
});

http://silex.sensiolabs.org

【讨论】:

  • 原发帖人再次声明substr() 函数实际上并不是他想要的,这只是一个示例。
  • 所以他也写了例子! SO 不是我们应该猜测函数作者的意思的测验。
猜你喜欢
  • 2012-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-10
  • 2017-04-25
相关资源
最近更新 更多