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