Assetic twig图像功能的简短语法

时间:2012-11-23 13:28:39

标签: php image symfony twig assetic

我像这样在资产上添加图片:

{% image '@MyBundle/Resources/public/img/name.png' %} 
  <img src="{{ asset_url }}"/>
{% endimage %}

对我来说很好,但我想少写,所以我尝试创建一个像symfony2文档中的twig函数。但我不使用任何过滤器:

assetic:
    debug:          "%kernel.debug%"
    use_controller: false
    bundles:        [MyBundle]
    #java: /usr/bin/java
    filters:
        cssrewrite: ~
    twig:
        functions:
            timg: ~

但如果我现在使用它:

<img src="{{ timg('@MyBundle/Resources/public/img/name.png') }}" />

我得到例外:

  

在编译模板期间抛出异常(“Catchable Fatal Error:传递给Twig_Node_Expression_GetAttr :: __ construct()的参数3必须是Twig_Node_Expression_Array的实例,给定Twig_Node的实例,在C:\ wamp2 \ www中调用第66行上的\ symfony \ vendor \ symfony \ assetic-bundle \ Symfony \ Bundle \ AsseticBundle \ Twig \ AsseticNodeVisitor.php,在C:\ wamp2 \ www \ symfony \ vendor \ twig \ twig \ lib \ Twig \ Node \ Expression中定义\ getAttr.php第14行“)在”:: top.html.twig“中。

有什么想法吗?也许我不能在没有过滤器的情况下使用简单语法的函数?

2 个答案:

答案 0 :(得分:1)

我建议您定义一个非常简单的过滤器,并像{{ 'mypath'|timg }}一样使用它:

class ImgExtension extends \Twig_Extension
{
    private $asset;
    public function __construct(Container $c){
        $this->asset = $c->get('templating.helper.assets');
    }
    public function getFilters(){
        return array('timg' => new \Twig_Filter_Method($this, 'timg'));
    }
    public function timg($src, $package = null) {
        $url = $this->asset->getUrl($src, $package);
        return '<img src="'.$url.'" />';
    }
    public function getName(){
        return 'timg';
    }
}

然后您可以添加一些其他有用的参数,例如alttitle等。

答案 1 :(得分:0)

您的函数名称需要映射到过滤器名称。

例如:

assetic:
    debug:          "%kernel.debug%"
    use_controller: false
    bundles:        [MyBundle]
    filters:
        cssrewrite: ~
    twig:
        functions:
            cssrewrite: ~

允许您这样做:

<link rel="stylesheet" href="{{ cssrewrite('bundles/my/css/style.css') }}" />

这简单地说明了语法:使用cssrewrite作为一个函数可以在dev上运行,但不是prod - 没有发现确切的原因我会重新提出资产过滤器函数在树枝上的建议最适合image based filters

为了以同样的方式使用timg作为函数,必须首先将其定义为资产过滤器。您必须首先以a custom assetic filter实现它。

一眼@ alexcasalboni的回答提供了一个实现树枝过滤器的好例子,并且似乎比在symfony中设置资产过滤器的配置要少。