Php 将Symfony水合器登记在隔离束中

Php 将Symfony水合器登记在隔离束中,php,symfony,orm,doctrine-orm,hydration,Php,Symfony,Orm,Doctrine Orm,Hydration,我创建了几个模块化应用程序,它们共享捆绑包。其中一个bundle负责处理所有与实体/存储库相关的逻辑(我们称之为MyBundle) 此MyBundle包含多个自定义水合器。鉴于特定应用程序中包含条令配置,并且我不希望必须在其config.yml文件中注册捆绑水合器,我如何在捆绑包中注册这些水合器 我已经尝试在我的包中创建一个编译器类,然后在doctrine orm配置服务上调用AddCustomHyderationMode,但这不起作用 我还尝试创建一个“HydrationManager”类,注

我创建了几个模块化应用程序,它们共享捆绑包。其中一个bundle负责处理所有与实体/存储库相关的逻辑(我们称之为MyBundle)

此MyBundle包含多个自定义水合器。鉴于特定应用程序中包含条令配置,并且我不希望必须在其config.yml文件中注册捆绑水合器,我如何在捆绑包中注册这些水合器

我已经尝试在我的包中创建一个编译器类,然后在doctrine orm配置服务上调用AddCustomHyderationMode,但这不起作用


我还尝试创建一个“HydrationManager”类,注入实体管理器,然后在编译器过程中调用管理器上的addHydrator方法,该方法反过来调用getConfiguration()->addCustomHydrationMode(…),但这也不起作用

我正在寻找一个类似的解决方案,偶然发现了这个示例:


我在寻找类似的解决方案,偶然发现了这个例子:


我也尝试着做同样的事情,并且在kernel.request订阅者中添加我的Hydrators,注入doctrine.orm.entity_管理器,从这里可以调用getConfiguration()->addCustomHyderationMode()。可能有点老套,但它奏效了。。。直到我找到了这个答案,并按照ABM_Dan的答案实现。我一直在尝试做同样的事情,并管理——如果有兴趣的话——在kernel.request订阅者中添加我的Hydrator,注入doctrine.orm.entity_管理器,从中可以调用getConfiguration()->AddCustomHyderationMode()。可能有点老套,但它奏效了。。。直到我找到了这个答案,并按照ABM_Dan的答案实施。。。。然后,当然,不要忘记将编译器传递添加到包根处的包类中,如下所示:。。。然后,当然,不要忘记将编译器过程添加到bundle根目录下的bundle类中,如下所示:
<?php

namespace Vivait\UserBundle\DependencyInjection;

use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;

class DoctrineCompilerPass implements CompilerPassInterface
{
    /**
     * You can modify the container here before it is dumped to PHP code.
     *
     * @param ContainerBuilder $container
     *
     * @api
     */
    public function process(ContainerBuilder $container)
    {
        $ormConfigDef = $container->getDefinition('doctrine.orm.configuration');
        $ormConfigDef->addMethodCall(
            'addCustomHydrationMode',
            ['UserCustomerHydrator', 'Vivait\UserBundle\Adapter\Hydrator\CustomerHydrator']
        );
    }
}