3

私はDoctrine2(そして実際にはPHPの例外)を初めて使用しますが、このページに続いて、Doctrine 2(CodeIgniterの上)で堅牢な検証エンジンを考え出そうとしています。

今、私はValidateExceptionクラスをどこで定義するのか、そして(コントローラー、ライブラリーなどから)エンティティーで保存(永続化?)を行う方法を考えています。

これを行った後(たとえば、「認証」ライブラリで)、次のようなものが必要です。

$user->username = $username;
$user->email_address = $email_address;
$user->password = $password;

$em->persist($user);
$em->flush();

return $foo; //where $foo refers to whether $em->flush() worked...

その永続性が成功した(つまり、検証に合格して保存された)か、成功しなかった(つまり、検証に失敗した)かを簡単に返すことができます。

4

1 に答える 1

4

ユーザーファクトリーを持つことを検討したいと思うかもしれません。(フォームのPOSTから)データの配列を取得し、Userオブジェクトを返すメソッドを作成できます。これにより、アプリケーション内で使用する(そしてデータストアに保持される)新しいUserオブジェクトを作成するプロセス全体をカプセル化できます。この1つの場所ですべての試行/キャッチを実行でき、すべてのコントローラーがこの1つの関数を呼び出すだけです(コードがすべてのコントローラーに分散しているわけではありません)。

class UserFactory
{
  /** @var Doctrine Entity Manager */
  private $_em;

  function __construct(EntityManager $em) {
    $this->_em = $em;
  }

  function createUserFromArray($data) {
    $user = new User();
    $user->setUsername($data['username']);
    $user->setEmail($data['email']);

    $this->_em->persist($user);
    $this->_em->flush(); // Or this could be called from some other place

    return $user;
  }
}

次に、コントローラーで行うのは次のようなものだけです。

// Get the EntityManger from wherever (registry, session, etc)
$userFactory = new UserFactory($em);
$user = $userFactory->createFromArray($dataFromForm);

2つの追加事項。

1つは、プロパティ(ユーザー名と電子メール)に明示的なゲッターとセッターを使用する場合、それらが基準を満たさない場合、それらの関数内で例外をスローすることができます。

Userクラスの場合:

function setEmail($email) {
  // Do some validations on the email address
  if (!is_valid_email($email)) {
    throw new Exception('Invalid Email');
  }
  $this->email = $email;
}

2つ目は、これがあなたが本当に尋ねていた質問であり、ライフサイクルのコールバックについてだと思います。モデル/エンティティクラス自体でそれらを定義します。

class User
{
  /** @PrePersist @PreUpdate */
  function ensureUniqueEmail()
  {
    // Do your check, else throw exception
  }
}
于 2010-10-22T18:38:51.130 に答える