2015-10-06 162 views
2

我现在面临一个问题,关于继承与SonataAdminBundle继承问题

我有2个实体相互链接:AbstractPerson & 车辆 和2个实体继承AbstractPerson & 学会

<?php 

namespace Foo\Bundle\BarBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 
use Doctrine\Common\Collections\ArrayCollection; 

/** 
* AbstractPerson 
* 
* @ORM\Entity 
* @ORM\InheritanceType("SINGLE_TABLE") 
* @ORM\DiscriminatorColumn(name="discr", type="string") 
* @ORM\DiscriminatorMap({"person" = "Person", "society" = "Society"}) 
*/ 
abstract class AbstractPerson 
{ 
    /** 
    * @var integer 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    protected $id; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="name", type="string", length=255) 
    */ 
    protected $name; 

    /** 
    * @ORM\OneToMany(targetEntity="Vehicle", mappedBy="owner") 
    * @ORM\JoinColumn(nullable=false) 
    */ 
    protected $vehicles; 
} 

/** 
* Person 
* 
* @ORM\Entity 
*/ 
class Person extends AbstractPerson 
{ 
} 

/** 
* Society 
* 
* @ORM\Entity 
*/ 
class Society extends AbstractContact 
{ 
} 

而且还有我的车辆实体:

<?php 

namespace Foo\Bundle\BarBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 
use Doctrine\Common\Collections\ArrayCollection; 

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

     /** 
     * @ORM\ManyToOne(targetEntity="AbstractPerson" ,inversedBy="vehicles") 
     * @ORM\JoinColumn(name="person_id", referencedColumnName="id") 
     */ 
     protected $owner; 
} 

SonataAdminBundle使我们能够处理的实体之间的继承与setSubClasses方法设置在admin.yml:

services: 
    sonata.admin.abstract_contact: 
     class: Foo\Bundle\BarBundle\Admin\AbstractPersonAdmin 
     tags: 
      - { name: sonata.admin, manager_type: orm, group: "Vehicle Manager", label: "AbstractPerson", label_catalogue: "messages" } 
    arguments: 
     - ~ 
     - Foo\Bundle\BarBundle\Entity\AbstractPerson 
     - ~ 
    calls: 
     - [setSubClasses, [{society: Foo\Bundle\BarBundle\Entity\Society, person: Foo\Bundle\BarBundle\Entity\Person}]] # Here the method that handles inheritance 

现在我可以创建 & 社会但问题是在交通工具运动cle表格。从这个表格,我可以创造一个人,而是索纳塔要实例化一个AbstractPerson(抽象类)

Cannot initialize abstract class: Foo\Bundle\BarBundle\Entity\AbstractPerson 

如果有人可以帮助我实例化一个人或一个社会,而不是抽象的人,我会很高兴!

对不起,我的英语不好。

谢谢!

+0

你几乎已经完成,但你在你的管理作出了设计错误。 – pcm

+0

索纳塔管理员必须代表具体的实体,所以你绝不能创建一个基于抽象实体管理员。我会提供一个答案,解决这个问题,现在 – pcm

+0

@BwaBwa:凡在索纳塔是你遇到的错误? –

回答

1

的问题就解决了。见#2917

+0

尽管这个链接可能回答这个问题,但最好在这里包含答案的基本部分,并提供供参考的链接。如果链接页面更改,则仅链接答案可能会失效 – Marusyk

0

TL;博士:

1管理员对人
1管理员对社会
1管理员(可选)人+协会

长的故事:

在逻辑唯一的缺陷是“sonata.admin.abstract_contact”。 从架构的角度来看,Person和Society是两个完全不同的实体,并且您在此处使用的Single Table Inheritance仅用于帮助您的实现看起来更清洁

为了解决这个问题,需要两个单独的管理员,每个实体一个。
如果您想要一个同时管理两个实体的加入管理员,则需要创建一个第三个管理员服务,该服务有两个字段,都是“sonata_admin_type”,其中包含两个管理员。

+0

从我的开发中可以看出,admin类可以表示抽象模型,只要在BwaBwa的示例中调用setSubClasses。 但是,我发现它是否真正起作用通常是相当充满的。 –