Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 是否可以动态更改条令实体映射?_Php_Doctrine Orm - Fatal编程技术网

Php 是否可以动态更改条令实体映射?

Php 是否可以动态更改条令实体映射?,php,doctrine-orm,Php,Doctrine Orm,我有一个加载了PSR的包,它围绕它提供的“用户”实体定义了一系列关系 在使用此包的许多用例中,您可能希望保持所有实体的完整性,但是,替换您自己的用户实体 作为一个具体的例子,包给了我这个实体(在这里使用注释来保持清晰): 鉴于上述情况,我有没有办法用我自己的用户取代UserActionRule::$user中的用户关系,该用户关系的目标是CircalUser\Entity\user:Acme\Entity\user(假设它本身就是一个条令实体) e、 例如: function onBoostra

我有一个加载了PSR的包,它围绕它提供的“用户”实体定义了一系列关系

在使用此包的许多用例中,您可能希望保持所有实体的完整性,但是,替换您自己的用户实体

作为一个具体的例子,包给了我这个实体(在这里使用注释来保持清晰):

鉴于上述情况,我有没有办法用我自己的用户取代UserActionRule::$user中的用户关系,该用户关系的目标是CircalUser\Entity\user:Acme\Entity\user(假设它本身就是一个条令实体)

e、 例如:

function onBoostrap( $e ){
    DoctrineMagic::getMapping(UserActionRule::class)->get('user')->getManyToOne()->setTargetEntity(Acme\Entity\User::class);
}

谢谢大家!

我通过监听loadClassMetadata事件设法解决了这个问题

namespace CirclicalUser\Listener;

use Doctrine\ORM\Event\LoadClassMetadataEventArgs;
use Doctrine\Common\EventSubscriber;

class UserEntityListener implements EventSubscriber
{
    const DEFAULT_ENTITY = 'CirclicalUser\Entity\User';

    private $userEntity;

    public function __construct($userEntity)
    {
        $this->userEntity = $userEntity;
    }

    public function getSubscribedEvents()
    {
        return ['loadClassMetadata'];
    }

    public function loadClassMetadata(LoadClassMetadataEventArgs $eventArgs)
    {
        /** @var \Doctrine\ORM\Mapping\ClassMetadata $classMetadata */
        $classMetadata = $eventArgs->getClassMetadata();

        if ($this->userEntity == self::DEFAULT_ENTITY) {
            return;
        }

        switch ($classMetadata->getName()) {
            case 'CirclicalUser\Entity\UserActionRule':
                $classMetadata->associationMappings['user']['targetEntity'] = $this->userEntity;
                break;
        }
    }
}
此侦听器成功地将映射替换为用户定义的实体类

添加侦听器(Zend Framework)非常简单:

'doctrine' => [
    'eventmanager' => [
        'orm_default' => [
            'subscribers' => [
                UserEntityListener::class,
            ],
        ],
    ],
另外,在service manager配置中:

'service_manager' => [

    'invokables' => [
        UserAuthenticationLogMapper::class => UserAuthenticationLogMapper::class,
    ],

    'factories' => [
        UserEntityListener::class => UserEntityListenerFactory::class,
    ],

],

您是否尝试过将EventSubscriber加载到
loadClassMetadata
event?你们可以从我刚才提到的问题中找到很大的灵感,我已经用loadClassMetadata解决了这个问题!我会把我的答案贴在下面。干得好!请接受您的答案,以便将问题标记为已解决。
'service_manager' => [

    'invokables' => [
        UserAuthenticationLogMapper::class => UserAuthenticationLogMapper::class,
    ],

    'factories' => [
        UserEntityListener::class => UserEntityListenerFactory::class,
    ],

],