Я думаю, вы можете захотеть взглянуть на наличие фабрики пользователей. У вас могут быть методы, которые берут массив данных (из POST формы) и возвращают объект User. Это позволяет вам инкапсулировать весь процесс создания нового объекта User для использования в вашем приложении (и сохраняется в вашем хранилище данных). Вы можете выполнять все свои попытки / отловы в этом единственном месте, и все ваши контроллеры просто вызывают эту функцию (код не разбросан по всем вашим контроллерам).
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);
Две вещи, дополнительные вещи.
Во-первых, если вы используете явные методы получения и установки для своих свойств (имя пользователя и адрес электронной почты), вы можете генерировать исключения в этих функциях, если они не соответствуют критериям.
В вашем классе пользователя:
function setEmail($email) {
// Do some validations on the email address
if (!is_valid_email($email)) {
throw new Exception('Invalid Email');
}
$this->email = $email;
}
Во-вторых, я думаю, что этот вопрос вы действительно задавали о обратных вызовах жизненного цикла. Вы сами определяете их в / в ваших классах Model / Entity.
class User
{
/** @PrePersist @PreUpdate */
function ensureUniqueEmail()
{
// Do your check, else throw exception
}
}