Orm 为什么条令2没有验证所有值是否符合实体属性的基本验证方法?

Orm 为什么条令2没有验证所有值是否符合实体属性的基本验证方法?,orm,doctrine,doctrine-orm,datamapper,Orm,Doctrine,Doctrine Orm,Datamapper,我对第二条教义不熟悉 为什么原则2没有验证所有值是否符合实体属性的基本验证方法? 我的问题旨在更多地了解第2条原则是如何运作的,以及为什么不说第2条原则有什么错误。(主要是因为我是新来的,我对第二条原则的设计方式缺乏一些了解) 示例: <?php // entities/User.php /** * @Entity @Table(name="users") **/ class User { /** * @Id @GeneratedValue @Column(type=

我对第二条教义不熟悉

为什么原则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;

}

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

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

$someEntity->isValid();

那么可能是出了问题,因为实体应该总是有效的,它的任何依赖项都应该在构造时设置,并在setters/getter中处理,这样对象就不会达到不一致的状态。

主要原因是关注点分离。由于实体是相当愚蠢的对象,对世界其他地方不太了解,因此它们进行验证的能力从一开始就受到限制

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

也就是说,如果您只想进行基本验证,只需在setter中进行验证

<?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;
     }

}

混合使用实体和验证不是一个好主意,但在实体中使用此规则作为注释和验证逻辑,并将其放在单独的aspect validator类中是有意义的

检查在Spring框架中是如何完成的-

以及如何用doctrine2和go来实现它-

看看这里:我在doctrine-project.org/blog/doctrine2-validations.html中提问之前已经看过了。但在条令中没有内置验证方法,只有不使用实体属性定义的自定义方法。或者我错过了什么?实际上没有内置的验证。所以我问为什么?如果实体属性定义了列类型等。。为什么不将它们用于基本验证?我们不会提供任何验证器的Doctrine 2,原因是我们认为所有框架都已经提供了可以轻松集成到您的域中的非常分散的框架。除了我们是ORM专家,不想再维护另一个验证库之外,将验证责任转移到域层还可以让您更容易地将其集成到框架表单库中。例如,为了扩展这一点,数据验证通常应该在控制器中执行。对于您的特定用例,Symfony 2如何使用表单组件执行数据验证就是一个很好的例子。因此,使用
$form->isValid
而不是
$entity->isValid()
,同时允许您指定用于验证的自定义约束,以保持实体对象代码更干净、更快。
<?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;
     }

}