如何在树枝上拨打ucwords?

r3w*_*3wt 5 twig

编辑:2016年12月3日

我在twig上发现了几个关于调用php函数的帖子,这表明它应该受到支持,但它似乎不起作用.

{{ ucwords( item|replace({'_':' '}) ) }}

结果:l

超薄应用程序错误

由于以下错误,应用程序无法运行:

细节

类型: Twig_Error_Syntax消息:第101行的"home.twig"中不存在函数"ucwords"

文件: /usr/share/dev89/html/vhosts/local/libs/vendor/twig/twig/lib/Twig/ExpressionParser.php行:572

Jav*_*luz 22

正如@lxg所说,不可能从Twig模板中调用所有PHP函数......除非你想这样做并定义你自己的过滤器/函数.而不是缺点,"强迫"您创建不包含太多逻辑的良好模板是一件好事.

无论如何,在这种特殊情况下,Twig已经包含一个名为title的过滤器,它应用了"标题案例",它相当于ucwords()PHP函数:

{{ item|replace({'_':' '})|title }}
Run Code Online (Sandbox Code Playgroud)

  • 为了澄清讨论,社区内的最佳实践是在视图之外执行"业务逻辑",并使用"MVC"设计模式向视图提供必要的对象模型和数据.像"ucwords"这样的东西在视图中很好,但是模型可以更好地处理.就像`item :: getTitle()`然后在你的树枝模板中使用`{{item.title}}`.这样,如果您更改了`item :: getTitle()`在模型中的功能,它将应用于所有视图.显着减少代码管理和重构,因为模型处理繁重而不是模板. (3认同)

lxg*_*lxg 7

并非所有PHP函数都在Twig中可用.只有少数 Twig 过滤器函数与PHP中的等价物具有相同的名称.

但是你可以很容易地创建自己的枝条扩展ucwords-过滤器以及功能:

<?php

namespace Acme\TestBundle\Twig;

class UcWordsExtension extends \Twig_Extension
{
    public function getFunctions()
    {
        return [
            new \Twig_SimpleFunction('ucwords', 'ucwords')
        ];
    }

    public function getFilters()
    {
        return [
            new \Twig_SimpleFilter('ucwords', 'ucwords')
        ];
    }

    public function getName()
    {
        return 'ext.ucwords';
    }

}
Run Code Online (Sandbox Code Playgroud)

Twig_SimpleFunction/ 的第一个参数Twig_SimpleFilter是Twig中函数/过滤器的名称.第二个参数是PHP可调用的.由于ucfirst函数已经存在,将其名称作为字符串传递就足够了.

在树枝上测试:

{{ "test foobar"|ucwords }} {# filter #} <br>
{{ ucwords("test foobar") }} {# function #} 
Run Code Online (Sandbox Code Playgroud)

返回:

Test Foobar
Test Foobar
Run Code Online (Sandbox Code Playgroud)


RAZ*_*IUL 5

为什么不使用title过滤器?我一直在寻找一个可以像ucwords()php函数一样工作的过滤器,并且titleTwig Documentation中找到了该过滤器。

使用示例;

{{ 'i am raziul islam'|title }}
Run Code Online (Sandbox Code Playgroud)

输出:我是伊斯兰教士