我正在使用Zend Framework 2和Doctrine 2开发一个项目。
我有以下维护数据库的过程:
我想用自定义业务代码丰富生成的实体:我可以简单地编辑生成的实体,但这意味着在每个新实体生成时丢失我的自定义代码,我正在寻找更好的工作流程。
基本上,这是我可以做的事情:
生成的实体:
namespace My\Base\Entity;
class Cart
{
private $quantity;
public function setQuantity($quantity)
{
$this->quantity = $quantity;
return $this;
}
public function getQuantity()
{
return $this->quantity;
}
}
丰富的实体:
namespace My\Entity;
class Cart extends \My\Base\Entity\Cart
{
public function setQuantity($quantity)
{
$quantity = filter_var(
$quantity,
\FILTER_VALIDATE_INT, array('min_range' => 1)
);
if ($quantity === false) {
throw new \InvalidArgumentException(
'Quantity should be an integer higher than 0'
);
} else {
return parent::setQuantity($quantity);
}
}
}
这不起作用,因为Doctrine期望\ My \ Entity \ Cart本身就是一个实体(虽然它只是基础实体的扩展)。
有没有办法实现类似的东西?
答案 0 :(得分:1)
不幸的是,没有。 Doctrine中的代码生成功能是作为“第三类公民”提供的,这意味着您不应该依赖它。它适用于您的实体的初始骨架生成,但之后您应该手动编辑它们。
虽然在大多数情况下,但实体生成器非常聪明,可以在修改架构时找出实体中的差异,并且它只会添加正确的方法。它永远不会完全覆盖您的实体。它也永远不会取消财产删除。
我建议尝试让实体生成器完成它的工作,然后使用您选择的版本控制软件进行差异化,看看它是否做得对。
答案 1 :(得分:0)
在我看来,这取决于你想要达到的目标。
在描述的代码中,我看到了类似简单验证的内容。
我使用函数 getInputFilter()扩展了我的Entity类,我保留验证规则单条记录。
public function getInputFilter()
{
if (!$this->inputFilter) {
$inputFilter = new InputFilter();
$factory = new InputFactory();
$inputFilter->add($factory->createInput(array(
'name' => 'id',
'required' => true,
'filters' => array(
array('name' => 'Int'),
),
)));
// [...]
$this->inputFilter = $inputFilter;
}
return $this->inputFilter;
}
请查看以下链接以查看完整代码:https://github.com/evolic/zf2-tutorial/blob/v0.4.2/module/Album/src/Album/Entity/Song.php
其他方法,例如检索我放入模型类的所有记录或单个 :( / module /Album/src/Album/Model/Song.php)
可以在这里找到控制器类:(/ module / Album/src/Album/Controller/SongController.php)
可以在https://github.com/evolic/zf2-tutorial/blob/v0.4.2/
找到整个代码我不是基于数据库生成实体。我自己创造它们。
我希望能帮到你。
答案 2 :(得分:0)
您必须将基本实体标记为mappedSuperclass
/** @MappedSuperclass */
class BaseCart