gpt4 book ai didi

Symfony TwigBundle 不加载任何自定义扩展

转载 作者:行者123 更新时间:2023-12-04 10:54:48 24 4
gpt4 key购买 nike

我正在更新 Zikula从 Symfony 3 到 Symfony 4(我目前专门在 this PR 工作)。其中一部分是删除 Symfony 的旧模板机制并完全切换到 Twig。在此过程中,我遇到了一个非常不寻常的问题:included Bundles 中没有自定义 Twig 扩展。或 pseudo bundles (它们只是名为模块的捆绑包)在模板中加载并可用。

,扩展类是 Autowiring 和自动加载的,是的它们是可用的 - 即它们在 bin/console debug:container 中列出特别是如果我做类似的事情

me% bin/console debug:container AdminExtension

Information for Service "Zikula\AdminModule\Twig\Extension\AdminExtension"
==========================================================================

---------------- --------------------------------------------------
Option Value
---------------- --------------------------------------------------
Service ID Zikula\AdminModule\Twig\Extension\AdminExtension
Class Zikula\AdminModule\Twig\Extension\AdminExtension
Tags twig.extension
Public no
Synthetic no
Lazy no
Shared yes
Abstract no
Autowired yes
Autoconfigured yes
---------------- --------------------------------------------------

! [NOTE] The "Zikula\AdminModule\Twig\Extension\AdminExtension" service or alias has been removed or inlined when the
! container was compiled.

这清楚地表明,不仅服务被正确地自动连接,而且它也被正确标记。

如果我这样做 bin/console debug:twig 列出了自定义扩展(在顶部带有功能、过滤器等)。我什至试图通过 TwigBundle Compiler过程,我很确定可调用对象包含在其中。

你知道问题是什么或者我可以如何解决它吗?

最佳答案

免责声明:我不太确定依赖注入(inject)修饰是如何工作的。

依赖注入(inject)装饰不会让你编写一个合适的装饰器(因为无论如何都无法检查它),但是,有一些迹象表明它不是装饰器。

主要指标:装饰类不依赖于装饰类,如:它不需要作为 __construct() 的参数或以其他方式注入(inject)。

推理:装饰器应该以级联/可链接的方式使用,本质上,装饰器应该像这样使用(在你的情况下不起作用!):

$instance = new Decorator2(new Decorator1(new DecoratedClass()));

和装饰器(方法)平均应该是这样的:
class Decorator {
protected $inner;
public function __construct(DecoratedClass $inner) {
$this->inner = $inner;
}
public function someMethod($someParam) {
// do something before, maybe change $someParam
$returnValue = $this->inner->someMethod($someParam);
// do something after, maybe change $returnValue
return $returnValue;
}
}

symfony page on decorating实际上直接或间接地说明了大部分内容(引用 this wikipedia article )。

据我所知,每个类都必须正确添加装饰类的所有功能(烦人的 AF),如:在内部对象上调用它。

现在,一种方法可能是说:“好吧,我并不真正关心实际的装饰,我只想使用我的类而不是 twig 环境!”

在这种情况下,您应该积极地将其替换为您的类(class),正如我在评论 (services.yaml) 中指出的那样:
services:
Twig\Environment: Your\Class\Name
Your\Class\Name: # NO DECORATES!!!
arguments: ...
calls: ...
twig: Your\Class\Name # maybe setting it via alias is effective...

当某事需要 Twig\Environment 时,这应该会导致您的类(class)被使用。或 twig或者你的类(class)。

但是,在装饰案例中,您的类应该装饰它扩展的类,而不是该类具有的别名。

关于Symfony TwigBundle 不加载任何自定义扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59277303/

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