我在资产上添加图片,如下所示:
{% 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') }}" />
我得到例外:
在编译模板期间抛出了一个异常("可捕获的致命错误:传递给 Twig_Node_Expression_GetAttr::__construct() 的参数 3 必须是 Twig_Node_Expression_Array 的实例,给定Twig_Node的实例,在第 66 行的 C:\wamp2\www\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 行"中定义)。顶.html.树枝"。
有什么想法吗?也许我不能在没有过滤器的情况下只使用函数进行简短的语法?
我建议您定义一个非常简单的过滤器并像{{ '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';
}
}
然后你可以添加一些其他有用的参数,如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') }}" />
这只是说明了语法:使用 cssrewrite 作为函数适用于 dev,但不适用于 prod——没有发现我重申资产过滤器函数最适合基于图像的过滤器的建议的确切原因。
为了以同样的方式将timg
用作函数,必须首先将其定义为资产过滤器。您必须先将其实现为自定义资产筛选器。
一目了然,@alexcasalboni的回答提供了一个实现树枝过滤器的很好的例子,并且似乎比在symfony中设置资产过滤器的配置更少。