我使用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?
謝謝。