2

我是教义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;

}

验证中使用构建的代码示例(不需要连接到数据库,只验证@Column(type =“integer”))教义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

谢谢

4

3 回答 3

5

Doctrine ORM 假设您持久化的实体处于有效状态。这是持久层的唯一工作,向它添加验证是错误的。如果您的实体中包含无效数据,则您已经拥有不应保存的无效对象图。

所以请记住,如果你曾经有过类似的 API

$someEntity->isValid();

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

于 2013-02-08T20:21:04.923 回答
0

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

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

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

于 2014-06-29T23:16:03.817 回答
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;
     }

}

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

于 2013-02-08T22:39:15.690 回答