扩展Doctrine 2实体

时间:2013-05-03 19:00:22

标签: php doctrine-orm

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

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

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

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

    基本上,这是我可以做的事情:

    生成的实体:

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

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

3 个答案:

答案 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

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