Как обрабатывать исключения при проверке Doctrine 2 - PullRequest
3 голосов
/ 05 сентября 2010

Я новичок в Doctrine 2 (и, правда, в 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...

Я мог бы просто вернуть, было ли это постоянство успешным (то есть прошел проверку исохранено) или не удалось (т. е. не удалось проверить).

1 Ответ

4 голосов
/ 22 октября 2010

Я думаю, вы можете захотеть взглянуть на наличие фабрики пользователей. У вас могут быть методы, которые берут массив данных (из 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
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...