ユーザーファクトリーを持つことを検討したいと思うかもしれません。(フォームの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
}
}