在自定义 Twig 过滤器中调用内置过滤器
Call built-in filter in custom Twig filter
设置自定义 Twig 过滤器时(参见 https://symfony.com/doc/current/templating/twig_extension.html ),如何在我的自定义函数中调用现有的 Twig 过滤器?
建议 parent::dateFilter($timestamp, $format);
但这不起作用:
Attempted to call an undefined method named "dateFilter" of class "Twig_Extension".
方法 dateFilter()
属于 class DateEmptyIfNull
。在这种情况下,您的 class 必须扩展此 class
您链接的示例实际上不正确。正确的做法是这样的,
class DateEmptyIfNull extends Twig_Extension // or: extends AbstractExtension
{
public function getFilters()
{
return array(
new TwigFilter('date', [ $this, 'dateFilter'], ['needs_environment' => true, ]),
);
}
public function dateFilter(Twig_Environment $env, $timestamp, $format = 'F j, Y H:i')
{
return $timestamp === null ? '' : twig_date_format_filter($env, $timestamp, $format);
}
}
并非所有的 twig 扩展都有其专用的全局 php 函数(我认为主要适用于第 3 方 twig 扩展)那么如果您使用 symfony 框架,最好的方法是使用自动装配,因为 twig 函数是 public 并且可以通过 php.
调用
在我的例子中,我想创建一个 asset
函数,它将远程文件下载到本地文件系统,然后 returns 可以与 imagine_filter
过滤器一起使用的本地路径(只能轻松处理本地图像)
将树枝 class 添加到服务 yaml 以允许在必要时自动装配。
services.yaml
services:
Symfony\Bridge\Twig\Extension\AssetExtension: '@twig.extension.assets'
使用构造函数创建您自己的过滤器 filter/function,可以在其中注入其他扩展。
<?php
declare(strict_types=1);
namespace App\Twig;
use Symfony\Bridge\Twig\Extension\AssetExtension;
use Twig\Extension\AbstractExtension;
use Twig\TwigFunction;
class ImageAssetExtension extends AbstractExtension
{
private AssetExtension $assetExtension;
public function __construct(
AssetExtension $assetExtension,
) {
$this->assetExtension = $assetExtension;
}
public function getFunctions(): array
{
return [
new TwigFunction('asset_image', [$this, 'assetImage']),
];
}
public function assetImage(string $path, string $packageName = null): string
{
// do something more here (like downloading a remote asset and returning the local path)
return $this->assetExtension->getAssetUrl($path, $packageName);
}
}
设置自定义 Twig 过滤器时(参见 https://symfony.com/doc/current/templating/twig_extension.html ),如何在我的自定义函数中调用现有的 Twig 过滤器?
parent::dateFilter($timestamp, $format);
但这不起作用:
Attempted to call an undefined method named "dateFilter" of class "Twig_Extension".
方法 dateFilter()
属于 class DateEmptyIfNull
。在这种情况下,您的 class 必须扩展此 class
您链接的示例实际上不正确。正确的做法是这样的,
class DateEmptyIfNull extends Twig_Extension // or: extends AbstractExtension
{
public function getFilters()
{
return array(
new TwigFilter('date', [ $this, 'dateFilter'], ['needs_environment' => true, ]),
);
}
public function dateFilter(Twig_Environment $env, $timestamp, $format = 'F j, Y H:i')
{
return $timestamp === null ? '' : twig_date_format_filter($env, $timestamp, $format);
}
}
并非所有的 twig 扩展都有其专用的全局 php 函数(我认为主要适用于第 3 方 twig 扩展)那么如果您使用 symfony 框架,最好的方法是使用自动装配,因为 twig 函数是 public 并且可以通过 php.
调用在我的例子中,我想创建一个 asset
函数,它将远程文件下载到本地文件系统,然后 returns 可以与 imagine_filter
过滤器一起使用的本地路径(只能轻松处理本地图像)
将树枝 class 添加到服务 yaml 以允许在必要时自动装配。
services.yaml
services:
Symfony\Bridge\Twig\Extension\AssetExtension: '@twig.extension.assets'
使用构造函数创建您自己的过滤器 filter/function,可以在其中注入其他扩展。
<?php
declare(strict_types=1);
namespace App\Twig;
use Symfony\Bridge\Twig\Extension\AssetExtension;
use Twig\Extension\AbstractExtension;
use Twig\TwigFunction;
class ImageAssetExtension extends AbstractExtension
{
private AssetExtension $assetExtension;
public function __construct(
AssetExtension $assetExtension,
) {
$this->assetExtension = $assetExtension;
}
public function getFunctions(): array
{
return [
new TwigFunction('asset_image', [$this, 'assetImage']),
];
}
public function assetImage(string $path, string $packageName = null): string
{
// do something more here (like downloading a remote asset and returning the local path)
return $this->assetExtension->getAssetUrl($path, $packageName);
}
}