首页 > 解决方案 > Symfony Compiler Pass:添加学说过滤器时出错

问题描述

CompilerPass我想在我创建的捆绑包中添加一个学说过滤器。

我试过这个,我认为添加了过滤器FilterCollection(因为我在:enable()调用函数时调用了 dump() )。

class UserCompilerPass implements CompilerPassInterface
{
    public function process(ContainerBuilder $container): void
    {

        $container->getDefinition('doctrine.orm.default_configuration')
            ->addMethodCall('addFilter', [
                'deleted_at',
                DeletedAtFilter::class,
            ])
        ;

        $container->getDefinition('doctrine.orm.default_entity_manager')
            ->addMethodCall('getFilters', [], true)
            ->addMethodCall('enable', [
                'deleted_at',
            ])
        ;

但是现在,我有这个错误:

传递给 Doctrine\Bundle\DoctrineBundle\ManagerConfigurator::configure() 的参数 1 必须实现接口 Doctrine\ORM\EntityManagerInterface,给出 Doctrine\ORM\Query\FilterCollection 的实例

我认为->addMethodCall('getFilters', [], true)取代了原来的doctrine.orm.default_entity_manager服务类。你知道如何避免这种行为吗?

标签: symfony

解决方案


第三个参数 onaddMethodCall指示 DI 编译器从该点开始使用调用的返回值作为服务实例。

正如您在方法的签名中看到的:

addMethodCall(string $method, array $arguments = [], bool $returnsClone = false)

其中第三个参数明确记录为“调用是否返回服务实例”。

如果您必须调用enableFilterCollection 上的方法,则必须装饰配置器服务并enable从那里调用该方法。


推荐阅读