为什么Doctrine 2没有基本的验证方法来验证所有值是否适合实体属性?

时间:2013-01-29 13:42:05

标签: orm doctrine doctrine-orm datamapper

我是学说2的新人。

为什么Doctrine 2没有基本的验证方法来验证所有值是否适合实体属性?

我的问题目标是更多地了解教义2是如何工作的,为什么不说教义2中的错误。(主要是因为我是新的,我错过了对教义2设计方式的一些理解)

示例:

<?php
// entities/User.php
/**
 * @Entity @Table(name="users")
 **/
class User
{
    /**
     * @Id @GeneratedValue @Column(type="integer")
     * @var int
     **/
    protected $id;

    /**
     * @Column(type="string")
     * @var string
     **/
    protected $name;

}

使用build in validate的代码示例(不需要连接到db,只验证@Column(type =“integer”))在doctrine 2中不存在的基本函数:

$user=new User();
$user->setId('trtr');
$user->setName("goodname");
if($user->validate()){
  echo 'ok';
}
else{
  echo $user->validateError();
}

//output: id of User should be integer and not string

由于

3 个答案:

答案 0 :(得分:5)

Doctrine ORM假定您持久存在的实体处于有效状态。这是持久层的唯一工作,并且向其添加验证将是错误的。如果您的实体中包含无效数据,则您已经拥有了无法保存的无效对象图。

所以请记住,如果你曾经有过像

这样的API
$someEntity->isValid();

然后有些东西可能是错误的,因为实体应该始终有效,并且它的任何依赖性应该在构造时设置并在setter / getters中处理,以便对象永远不会达到不一致状态。

答案 1 :(得分:0)

主要原因是关注点分离。由于实体是相当愚蠢的对象,对世界其他地方知之甚少,因此它们进行验证的能力仅限于开始。

例如,您的典型实体无法验证特定属性是否唯一。

也就是说,如果您只想进行基本验证,只需在设置器中进行验证即可。

<?php
class MyEntity {

    // ...

    /**
     * @ORM\Column(length="32")
     */
     protected $myProperty;

     public function setMyProperty($prop){
         if (! is_string($prop))
             throw new \InvalidArgumentException('MyEntity::setMyProperty() expects a string!';
         if (strlen($prop) > 32)
             throw new \LengthException('Argument passed to MyEntity::setMyProperty() is too long!');
         $this->myProperty = $prop;
     }

}

此方法可用于强制执行数据类型,长度等。除此之外的任何内容都可以在实体内部以外的地方更好地处理。

答案 2 :(得分:0)

混合实体和验证并不是一个好主意,但将实体中的这些规则作为注释和验证逻辑放在分离的方面验证器类中是有意义的。

检查它在Spring框架中的完成情况 - http://www.abtosoftware.com/blog/form-validation-using-aspect-oriented-programming-aop-in-spring-framework

以及如何使用doctrine2实现它并且去 - http://go.aopphp.com/blog/2013/07/21/implementing-logging-aspect-with-doctrine-annotations/