2017-06-16 13 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()メソッドを持つ "ViewPlaceInterface"を宣言し、 "Cinema"、 "TV"、 "Computer"クラスでこのインターフェイスを実装するという非常に簡単な方法です。

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はどのように構成されるべきですか?どのようにソナタ管理者を設定するには?

ありがとうございます。

答えて

関連する問題