Php Assetic细枝图像函数的简短语法

Php Assetic细枝图像函数的简短语法,php,image,symfony,twig,assetic,Php,Image,Symfony,Twig,Assetic,我在assetic上添加了如下图片: {% image '@MyBundle/Resources/public/img/name.png' %} <img src="{{ asset_url }}"/> {% endimage %} 但如果我现在使用它: <img src="{{ timg('@MyBundle/Resources/public/img/name.png') }}" /> 我得到一个例外: 编译模板期间引发异常(“可捕获致命错误:传递给Twi

我在assetic上添加了如下图片:

{% image '@MyBundle/Resources/public/img/name.png' %} 
  <img src="{{ asset_url }}"/>
{% endimage %}
但如果我现在使用它:

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

我得到一个例外:

编译模板期间引发异常(“可捕获致命错误:传递给Twig_节点_表达式_GetAttr::_构造()的参数3”)必须是第66行的Twig\u Node\u Expression\u数组的实例,给定Twig\u节点的实例,在C:\wamp2\www\symfony\vendor\symfony\assetic bundle\symfony\bundle\AsseticBundle\Twig\AsseticNodeVisitor.php中调用,并在C:\wamp2\www\symfony\vendor\Twig\lib\Twig\Node\Expression\GetAttr.php第14行“:top.html.Twig”中定义


有什么想法吗?也许我不能在没有筛选器的情况下仅使用函数作为简短语法?

我建议您定义一个非常简单的筛选器,并像
{{'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';
    }
}
类ImgExtension扩展\Twig\u扩展
{
私人美元资产;
公共函数构造(容器$c){
$this->asset=$c->get('templating.helper.assets');
}
公共函数getFilters(){
返回数组('timg'=>new\Twig_Filter_方法($this,'timg'));
}
公共函数timg($src,$package=null){
$url=$this->asset->getUrl($src,$package);
返回“”;
}
公共函数getName(){
返回“timg”;
}
}

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

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

例如:

assetic:
    debug:          "%kernel.debug%"
    use_controller: false
    bundles:        [MyBundle]
    filters:
        cssrewrite: ~
    twig:
        functions:
            cssrewrite: ~
允许您执行以下操作:

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

这简单地说明了语法:使用cssrewite作为函数可以在dev上工作,但不能在prod上工作-没有揭示我重申twig中assetic filter函数最适合的建议的确切原因

为了以相同的方式将
timg
用作函数,必须首先将其定义为Asset过滤器。您必须首先将其实现为

“一目了然”@alexcasalboni的回答提供了一个实施细枝过滤器的好例子,而且似乎比在symfony中设置Asset过滤器的配置要少。

这里我想到了这个简短的sintax
<link rel="stylesheet" href="{{ cssrewrite('bundles/my/css/style.css') }}" />