Вопрос

Я новичок в доктрине 2 (и исключения в PHP, действительно), но я пытаюсь придумать надежную проверку двигателя на доктрине 2 (сверху кодониктора), следуя эта страница.

Прямо сейчас мне интересно, где я бы определил класс 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...

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

Это было полезно?

Решение

Я думаю, что вы можете посмотреть на завод пользователя. У вас могут быть методы, которые принимают массив данных (из поста формы) и вернуть пользовательский объект. Это позволяет инкапсулировать весь процесс создания нового объекта пользователя для использования в вашем приложении (и сохраняется в вашем хранилище данных). Вы можете сделать все ваши попытки / ловить в этом одном месте, и все ваши контроллеры просто называют эту функцию (код не разбросан во всех ваших контроллерах).

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;
}

Двое, я думаю, что это вопрос, который вы действительно спрашивали, - это обратные вызовы жизненного цикла. Вы определяете тех, кто находятся в / в ваших классах модели / сущности.

class User
{
  /** @PrePersist @PreUpdate */
  function ensureUniqueEmail()
  {
    // Do your check, else throw exception
  }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top