gpt4 book ai didi

symfony - 在 Symfony 中覆盖 Twig 函数

转载 作者:行者123 更新时间:2023-12-04 10:09:50 25 4
gpt4 key购买 nike

是否有可能以及如何覆盖依赖项中定义的 Twig 函数?

ThirdPartyCode\HelloExtension 定义了 hello($string name) Twig 函数,返回 Hello, {$name}

在我的代码中,App\MyHelloExtension extends HelloExtension 我想覆盖 hello($string name) 函数以返回 Bye, {$name}.

但是,当我定义同名函数时,第三方函数被使用而我的函数永远不会被调用。如果我将其命名为不同,例如hello2 它工作正常。

最佳答案

您可以通过确保不会加载现有功能来完全替换现有功能。您可以通过编写在构建服务容器的最后一步中运行的 CompilerPass 来实现这一点。此 CompilerPass 将通过其 ID/类名查找服务,无论它是否已注册,然后将其从容器中删除。这将完全删除现有的扩展,您可以在其位置加载您的扩展。

参见:https://symfony.com/doc/current/service_container/compiler_passes.html

或者,您可能希望使用现有扩展中的逻辑并仅在其之上构建。对于这种服务装饰可能是一个很好的选择,因为装饰服务取代了原来的服务,同时在必要时仍然能够访问底层装饰服务。

services:
App\MyHelloExtension:
decorates: ThirdpartyCode\Extension
arguments:
- '@App\MyHelloExtension.inner' # this passes the decorated service, i.e. the original extension as an argument, see code snippet below

这将确保无论什么时候从容器中检索服务 ThirdpartyCode\Extension,他们都会得到您的扩展。这意味着您的扩展程序被加载到它的位置。当您的代码扩展现有扩展(如您的代码片段所示)或使用如下组合时,这种方法特别有效:


class MyHelloExtension extends TwigExtension
{
private $originalExtension;

public function __construct(HelloExtension $helloExtension)
{
$this->originalExtension = $helloExtension;
}

// ...

public function hello($name)
{
// Your method can still utilize the underlying original method if necessary.
return $this->originalExtension->hello() . ' ' . $name;
}
}

参见:https://symfony.com/doc/current/service_container/service_decoration.html

装饰服务时,必须注意只有一个扩展在 Twig 中注册。您可能应该确保在您自己的扩展上设置了 autoconfigure: false,并且您没有将其标记为 twig.extension

关于symfony - 在 Symfony 中覆盖 Twig 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61382911/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com