2016-07-11 5 views
1

私は提供する「ユーザー」エンティティの周りに一連の関係を定義するPSR読み込みパッケージを持っています。Doctrine Entityマッピングを動的に変更できますか?

このパッケージを使用するユースケースの多くでは、すべてのエンティティをそのまま維持したいが、独自のUserエンティティに置き換えることができます。具体的な例として

パッケージは、(明確なものを維持するためにここに注釈を使用して)私は、このエンティティを与え、:

上記の
namespace CirclicalUser\Entity; 

use Doctrine\ORM\Mapping as ORM; 

/** 
* An example entity that represents an action rule. 
* 
* @ORM\Entity 
* @ORM\Table(name="acl_actions_users") 
* 
*/ 
class UserActionRule 
{ 
    /** 
    * @var int 
    * @ORM\Id 
    * @ORM\ManyToOne(targetEntity="CirclicalUser\Entity\ActionRule", inversedBy="user_exceptions") 
    * @ORM\JoinColumn(name="action_rule_id", referencedColumnName="id") 
    */ 
    protected $action_rule; 

    /** 
    * @ORM\Id 
    * @ORM\ManyToOne(targetEntity="CirclicalUser\Entity\User") 
    * @ORM\JoinColumn(name="user_id", referencedColumnName="id") 
    */ 
    protected $user; 

} 

、私はUserActionRuleにおけるユーザ関係に取って代わる可能性がどのような方法があります:: $私自身のユーザーと、CirclicalUser \エンティティ\ユーザーを対象ユーザー:アクメ\エンティティ\ユーザー(それはそれ自体で教義のエンティティであると仮定した場合)

例えば、PHPふり:

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

ありがとうございました!

+1

あなたは 'loadClassMetadata'イベントにEventSubscriberを試みたことがありますか?あなたは素晴らしいインスピレーションを見つけることができます[SoftDeletableSubscriber](https://github.com/KnpLabs/DoctrineBehaviors/blob/14a4d19e808c955da1b0962b3cf0bdc9f69c61f0/src/ORM/SoftDeletable/SoftDeletableSubscriber.php#L89-L107) –

+1

ちょうど、 dはloadClassMetadataを使って解決しました!私は私の解決策を以下に掲示します。 – Saeven

+1

偉大な仕事!あなたの答えを受け入れてください。そうすれば、その問題は解決済みとマークされます。 –

答えて

1

私は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' => [ 

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

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

], 
関連する問題