インターフェイスを「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 を定義することはできないようですか?
エンティティは複数のインターフェイスを実装できるため、継承を使用したくありません。(多重継承不可)
何か案は?
たぶん、私が探すことができる良い検索キーワードですか?
どうもありがとう。