2017-07-01 35 views
0

我有一個Doctrine實體Foo,它與一對一模型中的AbstractBar原則實體相關。如何通過SonataAdminBundle(Symfony)管理Doctrine ORM類表繼承?

/** 
* @ORM\Table(name="foo") 
* @ORM\Entity 
*/ 
class Foo 
{ 
    /** 
    * @var int 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @var AbstractBar 
    * 
    * @ORM\OneToOne(targetEntity="AbstractBar", cascade={"persist"}) 
    * @ORM\JoinColumn(name="bar_id", referencedColumnName="id") 
    */ 
    private $bar; 
} 

AbstractBar實體是與兩個特定實體使用Class Table Inheritance

所以相關聯的抽象實體,我有這樣的:

/** 
* @ORM\Table(name="bar") 
* @ORM\Entity 
* @ORM\InheritanceType("JOINED") 
* @ORM\DiscriminatorColumn(name="bar_type", type="string") 
* @ORM\DiscriminatorMap({"one" = "BarOne", "two" = "BarTwo"}) 
*/ 
abstract class AbstractBar 
{ 
    /** 
    * @var int 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 
} 

/** 
* @ORM\Table(name="bar_one") 
* @ORM\Entity 
*/ 
class BarOne extends AbstractBar 
{ 
    // BarOne class properties 
} 

/** 
* @ORM\Table(name="bar_two") 
* @ORM\Entity 
*/ 
class BarTwo extends AbstractBar 
{ 
    // BarTwo class properties 
} 

Foo的管理面板(SonataAdminBundle)實體配置如下:

class FooAdmin extends AbstractAdmin 
{ 
    protected function configureFormFields(FormMapper $formMapper) 
    { 
     $formMapper 
      ->add('bar', AdminType::class, array(), array(
       'admin_code' => 'key.of.bar_one.admin.service' 
      )) 
     ; 
    } 
} 

同時,管理員級服務配置是這樣的:

key.of.bar_one.admin.service: 
    class: MyBundle\Admin\BarAdmin 
    arguments: [~, MyBundle\Entity\BarOne, ~] 
    tags: 
     - name: sonata.admin 
      manager_type: orm 
      show_in_dashboard: false 

上面的代碼讓我來編輯和編輯富實體創建巴羅實體。

我的問題是:我怎樣才能讓它在管理區域中的BarOneBarTwo之間切換?也就是說,我可以實現由Doctrine ORM(類表繼承)提供的多項選擇。

回答

1

爲您的抽象AbstractBar類創建管理員類,例如,

# MyBundle/Admin/BarAdmin.php 
class BarAdmin extends AbstractAdmin 
{ 
    ...  
} 

,並定義一個服務它,使用setSubclasses調用來定義你的表/對象繼承:

key.of.bar.admin.service: 
    class: MyBundle\Admin\AbstractBarAdmin 
    arguments: [~, MyBundle\Entity\AbstractBar, SonataAdminBundle:CRUD] 
    tags: 
     - { name: sonata.admin, manager_type: orm, show_in_dashboard: false } 
    calls: 
     - [setSubclasses, [{'Bar One': MyBundle\Entity\BarOne, 'Bar Tow': MyBundle\Entity\BarTwo]] 

更新您的FooAdmin使用新創建的管理類:

$formMapper 
    ->add('bar', AdminType::class, array(), array(
     'admin_code' => 'key.of.bar.admin.service' 
    )) 
; 

在您的BarAdmin類的內部,您可以檢查哪個具體對象需要相應地修改管理員,例如當配置表格字段

/** 
* @param FormMapper $form 
*/ 
protected function configureFormFields(FormMapper $form) { 
    $subject = $this->getSubject(); 

    // add shared fields 
    $form->add(); 

    // BarOne fields 
    if ($subject instanceof BarOne) 
    } 

    // BarTwo fields 
    if ($subject instanceof BarTwo) 
    } 
}