2017-06-16 60 views
1

我使用Symfony 3,Doctrine ORM和SonataAdminBundle。如何在數據庫級別實現接口(Symfony3,Doctrine ORM,SonataAdminBundle)?

有一個任務,可以通過在代碼級別上實現一些接口來解決,但我不知道如何正確地將這種結構的數據存儲在數據庫中,並在管理面板中編輯這些數據。

假設有這樣的初始條件。

有一個「電影」原則實體。數據庫中的表film

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

    ... 
} 

有一個「用戶」原則實體。數據庫中的表user

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

    ... 
} 

有一個「電影」原則實體。數據庫中的表cinema

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

    /** 
    * @var Town 
    * 
    * @ORM\ManyToOne(targetEntity="Town") 
    * @ORM\JoinColumn(name="town_id", referencedColumnName="id", nullable=false) 
    */ 
    private $town; 

    /** 
    * @return Town 
    */ 
    public function getTown() 
    { 
     return $this->town; 
    } 

    ... 
} 

正如我們所看到的,「電影院」有一個「鎮」字段,它決定了電影院位於哪個城鎮。所以還有一個「城鎮」主義實體。數據庫中的表town

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

    ... 
} 

下,有必要從這些數據中創建一個「視圖日誌」,即數據存儲有關的實體「查看」每個視圖(無關MVC的視圖)。數據庫中的表view

/** 
* @ORM\Table(name="view") 
* @ORM\Entity 
*/ 
class View 
{ 
    /** 
    * @var User 
    * 
    * @ORM\ManyToOne(targetEntity="User") 
    * @ORM\JoinColumn(name="user_id", referencedColumnName="id", nullable=false) 
    */ 
    private $user; 

    /** 
    * @var Film 
    * 
    * @ORM\ManyToOne(targetEntity="Film") 
    * @ORM\JoinColumn(name="film_id", referencedColumnName="id", nullable=false) 
    */ 
    private $film; 

    /** 
    * @var Cinema 
    * 
    * @ORM\ManyToOne(targetEntity="Cinema") 
    * @ORM\JoinColumn(name="cinema_id", referencedColumnName="id", nullable=false) 
    */ 
    private $cinema; 

    /** 
    * @return Cinema 
    */ 
    public function getCinema() 
    { 
     return $this->cinema; 
    } 

    ... 
} 

一個相當簡單的方案。

假設在我們的業務邏輯中,非常重要的是用戶在哪個城鎮觀看了電影。要找到一個小鎮,我們可以這樣做:$ view-> getCinema() - > getTown(),並獲得需要的「Town」對象。

但突然發現用戶不僅可以在電影院觀看電影,還可以在電視上看到: - - 通過電腦。

在代碼級別,解決方案看起來非常簡單:聲明具有getTown()方法並在「Cinema」,「TV」,「Computer」類中實現此接口的「ViewPlaceInterface」。

interface ViewPlaceInterface 
{ 
    /** 
    * @return Town 
    */ 
    public function getTown(); 
} 

class View 
{ 
    ... 

    /** 
    * @var ViewPlaceInterface 
    */ 
    private $viewPlace; 

    /** 
    * @return ViewPlaceInterface 
    */ 
    public function getViewPlace() 
    { 
     return $this->viewPlace; 
    } 

    ... 
} 

class Cinema implements ViewPlaceInterface 
{ 
    /** 
    * @return Town 
    */ 
    public function getTown() 
    { 
     ... 
    } 
} 

class TV implements ViewPlaceInterface 
{ 
    /** 
    * @return Town 
    */ 
    public function getTown() 
    { 
     ... 
    } 
} 

class Computer implements ViewPlaceInterface 
{ 
    /** 
    * @return Town 
    */ 
    public function getTown() 
    { 
     ... 
    } 
} 

這使我們可以調用$視圖 - > getViewPlace() - > getTown(),並獲得了 「鎮」 的對象。

我的問題:如何在Symfony 3,Doctrine ORM,SonataAdminBundle中實現?應該創建什麼表和實體?應如何配置原則ORM?如何配置sonata-admin?

謝謝。

回答