我有几个相关的实体,例如McDoublePrice
、CheeseburgerPrice
、BigMacPrice
等,它们在Mapped Superclass Doctrine 配置中具有公共BurgerPrice
实体。
如何从我的控制器、操作或请求处理程序访问特定实体?也就是说,我希望以下代码工作:
$burgers = array(
'McDoublePrice' => 4,
'CheeseburgerPrice' => 5,
'BigMacPrice' => 6
);
foreach($burgers as $burger => $burgerId)
{
$repository = $this->repositoryFactory->getBurgerRepository($burger);
$entity = $repository->getBurgerEntity($burgerId);
echo $entity->getBurgerPrice(); // total price of current burger
}
注意:不同$burgerId
的 s 可以代表同一种汉堡中不同的汉堡风格。即豪华版,普通版等,并且可以对相同类型的成分使用不同的具体价格。即普通包子和豪华包子可以有不同的$burderID和不同的包子定价。
问题:如何构建我的代码?
我是否为每个BurgerPrice
实体创建一个存储库类?这可能会创建很多额外的课程,而且看起来很浪费。
我可以通过一个BurgerRepository
可以处理多个汉堡的课程逃脱吗?如果是这样,我将如何以以教义为中心的方式进行设置?
我正在寻找代码示例或有关如何执行此操作的清晰想法。我主要对以 Doctrine 为中心或 Doctrine 推荐的方法来处理映射超类配置中的多个多态实体感兴趣。
我的最终目标是能够在运行时请求特定汉堡的定价。
我已经研究了Doctrine Entity Repository pattern,并且我想使用存储库结构(我可以在其中创建自定义方法名称),但是该示例没有显示如何将它与多态实体一起使用。
示例实体
/**
* @ORM\Entity(repositoryClass="BurgerPriceRepository")
* @Table(name="bigmac", indexes={@Index(name="product_id", columns={"product_id"})})
* @Entity
*/
class BigMacPrice extends BurgerPrice
{
/** @var float @Column(name="sauce", type="decimal", precision=6, scale=2, nullable=false) */
private $sauce;
function getBurgerPrice(): float
{
//secret sauce price
return 5 * $this->patty + 3 * $this->bun + $this->sauce;
}
}
/**
* @ORM\Entity(repositoryClass="BurgerPriceRepository")
* @Table(name="mcdouble", indexes={@Index(name="product_id", columns={"product_id"})})
* @Entity
*/
class McDoublePrice extends BurgerPrice
{
function getBurgerPrice(): float
{
//a different price for mcdouble
return 2 * $this->patty + 2 * $this->bun;
}
}
abstract class BurgerPrice
{
/** @var integer @Column(name="id", type="integer", nullable=false) @Id @GeneratedValue(strategy="IDENTITY") */
protected $id;
/** @var integer @Column(name="product_id", type="integer", nullable=false) */
protected $productId;
/** @var float @Column(name="patty", type="decimal", precision=6, scale=2, nullable=false) */
public $patty;
/** @var float @Column(name="bun", type="decimal", precision=6, scale=2, nullable=false) */
public $bun;
/**
* Computes specific product price for a given burger
*
* @return float
*/
abstract function getBurgerPrice(): float;
}