7

インターフェイスを「targetEntity」として使用しようとしています。簡単なコードは、私が何をしようとしているのかを説明する必要があります

インターフェース:

namespace Project\Entity;

interface AnimalInterface{


}

ネコ:

namespace Project\Entity;
use Doctrine\ORM\Mapping as ORM;
use Project\Entity\AnimalInterface;

/**
 * Represents an Invoice.
 *
 * @ORM\Entity
 * @ORM\Table(name="Cat")
 */
class Cat implements AnimalInterface  {

     /**
     * @var int
     * @ORM\Id @ORM\Column(type="integer", name="id")
     * @ORM\GeneratedValue
     */
     protected $id;
}

犬:

namespace Project\Entity;
use Doctrine\ORM\Mapping as ORM;
use Project\Entity\AnimalInterface;

/**
 * @ORM\Entity
 * @ORM\Table(name="Dog")
 */
class Dog implements AnimalInterface  {

     /**
     * @var int
     * @ORM\Id @ORM\Column(type="integer", name="id")
     * @ORM\GeneratedValue
     */
     protected $id;
}

AnimalFarm (動物を 1 匹だけ含めることができます ;)):

 namespace Project\Entity;
 use Doctrine\ORM\Mapping as ORM;

 /**
 * @ORM\Entity
 * @ORM\Table(name="AnimalFarm")
 */
class AnimalFarm  {
    /**
     *
     * @var int
     * @ORM\Id @ORM\Column(type="integer", name="id")
     * @ORM\GeneratedValue
     */
     protected $id;

     /**
     * @ORM\ManyToOne(targetEntity="Project\Entity\AnimalInterface")
     * @var AnimalInterface
     */
     protected $animal;


     public function setAnimal(AnimalInterface $animal){
         $this->animal = $animal;
     }
}

ここで指定されているように、TargetEntityResolver を使用しています -> http://symfony.com/doc/master/cookbook/doctrine/resolve_target_entity.html

bootstrap.php (Zend):

    $em = $doctrine->getEntityManager();
    $evm = $em->getEventManager();

    $listener = new  \Doctrine\ORM\Tools\ResolveTargetEntityListener();
    $listener->addResolveTargetEntity(
            'Project\Entity\AnimalInterface',
            'Project\Entity\Dog',
            array()
    );
    $listener->addResolveTargetEntity(
            'Project\Entity\AnimalInterface',
            'Project\Entity\Cat',
            array()
    );
    $evm->addEventListener(Doctrine\ORM\Events::loadClassMetadata, $listener);

Resolver は、最初に指定された 1 つのエンティティのみをインターフェイスに解決できるようです。この例では猫。Doctrine はテーブル dog との関係 (foreignkey) を持つテーブル AnimalFarm を構築します。EntityManager 経由で犬をテーブルに追加しようとすると、Doctrine は次のエラー メッセージで失敗します: Uncaught exception 'Doctrine\ORM\ORMException' with message 'Found entity of type Project\Entity\Dog on Association Project\Entity\AnimalFarm#動物ですが、[...] で Project\Entity\Cat' を期待しています

インターフェイスを介して複数の targetEntities を定義することはできないようですか?

エンティティは複数のインターフェイスを実装できるため、継承を使用したくありません。(多重継承不可)

何か案は?

たぶん、私が探すことができる良い検索キーワードですか?

どうもありがとう。

4

1 に答える 1