2015-10-06 150 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。 但是,我發現它是否真正起作用通常是相當充滿的。 –