如何从自定义树枝过滤器调用内置的树枝函数?

发布于 2025-01-26 01:20:07 字数 1040 浏览 2 评论 0原文

我想创建一个自定义过滤器,该过滤器将返回HTML链接到客户端配置文件。

我需要类似的东西:

<?php

namespace App\Twig;

use App\Entity\Client;
use Twig\Environment;
use Twig\Extension\AbstractExtension;
use Twig\TwigFilter;

class ClientExtension extends AbstractExtension
{
    /**
     * {@inheritdoc}
     */
    public function getFilters(): array
    {
        return [
            new TwigFilter('client_link', [$this, 'createClientLink'], [
                'is_safe' => ['html'],
                'needs_environment' => true,
            ]),
        ];
    }

    public function createClientLink(Environment $environment, Client $client): string
    {
        // this code is an example, such function does not exist
        $url = $environment->callTwigFunction('path', 'client_profile', [$client->getId()]);
        return '<a href="'.$url.'">'.$client->getEmail().'</a>';
    }
}

我不知道的是如何称呼PATH twig函数?我可以使用一些calltwigfunction类似的功能吗?

I want to create a custom filter which will return HTML link to client profile.

I need something like:

<?php

namespace App\Twig;

use App\Entity\Client;
use Twig\Environment;
use Twig\Extension\AbstractExtension;
use Twig\TwigFilter;

class ClientExtension extends AbstractExtension
{
    /**
     * {@inheritdoc}
     */
    public function getFilters(): array
    {
        return [
            new TwigFilter('client_link', [$this, 'createClientLink'], [
                'is_safe' => ['html'],
                'needs_environment' => true,
            ]),
        ];
    }

    public function createClientLink(Environment $environment, Client $client): string
    {
        // this code is an example, such function does not exist
        $url = $environment->callTwigFunction('path', 'client_profile', [$client->getId()]);
        return '<a href="'.$url.'">'.$client->getEmail().'</a>';
    }
}

What I cannot figure out is how do I call the path twig function? Is there some callTwigFunction-like feature I can use?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

兔小萌 2025-02-02 01:20:07

我已经这样实现了:

$url = $environment->getExtension(Symfony\Bridge\Twig\Extension\RoutingExtension\RoutingExtension::class)->getPath('cp_client_show_summary', ['id' => $client->getId()]);

多亏了@cerad 编辑的建议

我将保留上述代码,因为它显示了我对“呼叫内置twig”的更一般性问题的答案内部过滤器的功能”。但是,正如其他人在评论中指出的那样,我案件的正确方法是注入urlgeneratorInterface

class AppExtension extends AbstractExtension
{
    public function __construct(
        private readonly UrlGeneratorInterface $urlGenerator,
    ) {
    }

    //...

然后生成这样的URL:

$url = $this->urlGenerator->generate('cp_client_show_summary', ['id' => $client->getId()]);

I have implemented it this way:

$url = $environment->getExtension(Symfony\Bridge\Twig\Extension\RoutingExtension\RoutingExtension::class)->getPath('cp_client_show_summary', ['id' => $client->getId()]);

Thanks to the suggestion of @Cerad

EDIT:

I am going to keep the above code because it shows the answer to the more general question I had about "calling built-in twig functions from inside filters". However as pointed by others in the comments, the proper way for my case was to inject UrlGeneratorInterface:

class AppExtension extends AbstractExtension
{
    public function __construct(
        private readonly UrlGeneratorInterface $urlGenerator,
    ) {
    }

    //...

and then generate URL like this:

$url = $this->urlGenerator->generate('cp_client_show_summary', ['id' => $client->getId()]);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文