【问题标题】:Custom Twig filter not found when called调用时未找到自定义 Twig 过滤器
【发布时间】:2015-04-07 16:20:53
【问题描述】:

我正在尝试创建自己的 Twig 过滤器。我跟着这个教程Symfony Official Book。 但我收到此错误The filter "avatar" does not exist in src/Acme/Bundle/StoryBundle/Resources/views/Story/storyList.html.twig

这是我的 AvatarExtension.php

<?php

namespace AppBundle\Twig;

class AvatarExtension extends \Twig_Extension
{
    public function getFilters()
    {

        return array(
            new \Twig_SimpleFilter('avatar', array($this, 'avatar')),
        );

    }

    public function getName()
    {
        return 'avatar_extension';
    }

    public function avatar($user)
    {
        if ($user->getPicture() && $user->getPicture() != '') {
            return $user->getPicture();
        } else {
            return '/images/default-avatar.jpg';
        }
    }
}

还有我的 AppBundle/Resources/config/services.yml

services:
    app.twig.avatar_extension:
        class: AppBundle\Twig\AvatarExtension
        tags:
        – { name: twig.extension }

使用过滤器的模板与 Twig 扩展不在同一个包中,但由于它是一项服务,所以应该没有问题。 我是这样称呼它的:{{ story.author|avatar }}

你知道问题可能是什么吗?

编辑

# Twig Configuration
twig:
    debug:            "%kernel.debug%"
    strict_variables: "%kernel.debug%"
    globals:
      uploadTmpDir: %upload.tmp.relative.dir%

【问题讨论】:

  • services.yml 是这样缩进的吗?如果是这样,您需要将 - { name: twig.extension } 缩进另外 4 个空格。
  • 是的,您的 services.yml 文件正在编译看起来很奇怪,我以为您会收到“在映射中无法定义序列项”异常。
  • services.yml 文件已正确缩进。当我把它贴在这里时,缩进打破了
  • 尝试清除缓存
  • 检查php app/console container:debug|grep 'app.twig.avatar_extension' 是否正确加载了服务,然后检查您是否还没有注册另一个同名的树枝扩展。希望对您有所帮助。

标签: php symfony filter twig


【解决方案1】:

好的,我找到了解决方案。这是 services.yml

app.twig.avatar_extension:
        class: AppBundle\Twig\AvatarExtension
        tags:
            - { name: twig.extension }

这里是 ExtensionClass:

<?php

namespace AppBundle\Twig;

class AvatarExtension extends \Twig_Extension
{
    public function getFilters()
    {
        return array(
            new \Twig_SimpleFilter('avatar', array($this, 'avatarFilter')),
        );
    }

    public function avatarFilter($user)
    {
        if ($user->getPicture() && $user->getPicture() != '') {
            return $user->getPicture();
        } else {
            return '/images/default-avatar.jpg';
        }
    }

    public function getName()
    {
        return 'avatar_extension';
    }
}

我猜函数名一定有Filter后缀

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-09
    • 2014-05-10
    • 1970-01-01
    • 2017-06-14
    • 2016-08-11
    相关资源
    最近更新 更多