0

我正在使用 Zend Framework 2 和 Doctrine 2 开发一个项目。

我有以下维护数据库的过程:

  1. 我为我的实体编写 XML 映射文件
  2. 我使用命令“orm:generate-entities”生成实体
  3. 我使用命令“orm:schema-tool:update --force”生成数据库

我想用自定义业务代码丰富生成的实体:我可以简单地编辑生成的实体,但这意味着在每次新实体生成时都会丢失我的自定义代码,我正在寻找更好的工作流程。

基本上,这是我希望能够做到的:

生成的实体:

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 本身是一个实体(而它只是基本实体的扩展)。

有没有办法实现类似的东西?

4

3 回答 3

1

抱歉不行。Doctrine 中的代码生成功能是作为“三等公民”提供的,这意味着您不应该依赖它。对于实体的初始骨架生成很好,但之后您应该手动编辑它们。

尽管在大多数情况下,实体生成器足够聪明,可以在您修改架构时找出实体中的差异,并且它只会添加正确的方法。它永远不会完全覆盖您的实体。它也永远不会删除属性。

我建议尝试让实体生成器完成它的工作,然后与您选择的版本控制软件进行比较,看看它是否做了正确的事情。

于 2013-05-03T22:26:04.593 回答
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/

我不是基于数据库生成实体。我自己创建它们。

我希望对你有所帮助。

于 2013-05-08T19:16:53.477 回答
0

您必须将基础实体标记为 mappedSuperclass

/** @MappedSuperclass */
class BaseCart

http://doctrine-orm.readthedocs.org/projects/doctrine-orm/en/latest/reference/inheritance-mapping.html

于 2016-03-28T14:33:13.193 回答