doctrine targetEntity接口

roc*_*com 7 doctrine zend-framework

我试图将接口用作"targetEntity".简单的代码应该解释我打算做什么

接口:

namespace Project\Entity;

interface AnimalInterface{


}
Run Code Online (Sandbox Code Playgroud)

猫:

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;
}
Run Code Online (Sandbox Code Playgroud)

狗:

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;
}
Run Code Online (Sandbox Code Playgroud)

AnimalFarm(可以只包含一只动物;)):

 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;
     }
}
Run Code Online (Sandbox Code Playgroud)

我正在使用此处指定的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);
Run Code Online (Sandbox Code Playgroud)

似乎解析器只能将一个实体解析为接口,第一个给定的接口.在这个例子中猫.Doctrine构建表AnimalFarm与表狗的关系(foreignkey).当我试图通过EntityManager将一个狗添加到表时,Doctrine失败并出现以下ErrorMessage:未捕获的异常'Doctrine\ORM\ORMException',消息'找到实体类型Project\Entity\Dog on association Project\Entity\AnimalFarm#动物,但期待项目\实体\猫'[...]

似乎不可能通过接口定义多个targetEntities?

我不想使用继承,因为实体可以实现多个接口.(不能进行多重继承)

有任何想法吗?

也许我可以寻找好的搜索关键词?

非常感谢.

htm*_*m01 1

这取自doctrine2 docs。使用此方法只能解析一个对象。

/**
 * An interface that the invoice Subject object should implement.
 * In most circumstances, only a single object should implement
 * this interface as the ResolveTargetEntityListener can only
 * change the target to a single object.
 */
interface InvoiceSubjectInterface
{
    // List any additional methods that your InvoiceModule
    // will need to access on the subject so that you can
    // be sure that you have access to those methods.

    /**
     * @return string
     */
    public function getName();
}
Run Code Online (Sandbox Code Playgroud)