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;

}

ビルドインvalidate(dbに接続する必要はなく、@ 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

0

エンティティと検証を混在させるのは得策ではありませんが、このルールをエンティティに注釈として、また検証ロジックを別のアスペクト バリデータ クラスに含めることは理にかなっています。

Spring フレームワークでの実行方法を確認してください - http://www.abtosoftware.com/blog/form-validation-using-aspect-directional-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 に答える