1

设置自定义 Twig 过滤器时(请参阅https://symfony.com/doc/current/templating/twig_extension.html),如何在自定义函数中调用现有的 Twig 过滤器?

https://stackoverflow.com/a/41551944/1668200建议parent::dateFilter($timestamp, $format);,但这不起作用:

试图调用类“Twig_Extension”的名为“dateFilter”的未定义方法。

4

3 回答 3

1

您链接的示例实际上是不正确的。正确的方法是这样的,

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);
    }

}
于 2019-02-01T13:19:09.310 回答
0

并非所有 twig 扩展都有其专用的 gloal php 函数(我认为主要适用于 3rd 方 twig 扩展),那么如果您使用 symfony 框架,最好的方法是使用自动装配,因为 twig 函数是公共的并且可以通过 php 调用。

就我而言,我想创建一个asset函数,将远程文件下载到本地文件系统,然后返回可与imagine_filter过滤器一起使用的本地路径(仅适用于本地图像)

将 twig 类添加到服务 yaml 以在必要时允许自动装配。 services.yaml

services:
    Symfony\Bridge\Twig\Extension\AssetExtension: '@twig.extension.assets'

使用可以插入其他扩展的构造函数创建您自己的过滤器过滤器/函数。

<?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);
    }
}
于 2020-12-14T17:08:42.973 回答
-2

该方法dateFilter()属于 class DateEmptyIfNull。在这种情况下,您的课程必须扩展此类

于 2019-02-01T12:43:15.337 回答