Проверка сущности доктрины при построении

Я пытаюсь улучшить себя с учением и делаю лучшие практики.
Я нашел хорошую презентацию лучших практик: https://ocramius.github.io/doctrine-best-practices/#/50

Я пытаюсь получить действительный объект после __construct.
(увидеть https://ocramius.github.io/doctrine-best-practices/#/52)
Но я использую аннотацию @Assert для проверки моего объекта.

Как я могу сделать, чтобы проверить? Нужно внедрить службу валидатора внутри моего объекта в __construct?

Мой объект:

class Person
{
/**
* @var int
*
* @ORM\Column(name="id", type="guid")
* @ORM\Id
* @ORM\GeneratedValue(strategy="UUID")
* @expose
*/
private $id;

/**
* @var int
*
* @ORM\Column(name="name", type="string")
* @Assert\Email()
*/
private $email;

public function __construct($email, ValidatorInterface $validator){

$this->email = $email;
$validator->validate($this); // good practice ?

}

Моя конечная цель состоит в модульном тестировании входной проверки этой сущности.

Спасибо

Редактировать :

Основываясь на ответе Йонеля, я добавил это в конце моего конструктора:

 $errors = $validator->validate($this);
if(count($errors) > 0) {
$errorsString = (string) $errors;
throw new InvalidArgumentException($errorsString);
}

Это хорошая практика или нет? Если нет, то почему?
Спасибо!

2

Решение

Презентация использует лучшие практики как а также Мир.

Принцип, который вы выделяете, касается уровня представления приложения, которое может использовать компонент формы, который может проверять пользовательский ввод затем эти данные используются для создания экземпляра сущности.

В примере представления именованный конструктор принимает в качестве аргумента форму, поэтому проверка адреса электронной почты осуществляется с помощью формы (проверка ввода пользователя).

Значение наличия объекта с допустимое состояние подразумевает наличие объекта типа «Пользователь», который имеет действительное имя, фамилию и адрес электронной почты. (как пример не нуль).

Таким образом, вы можете иметь следующий объект:

class User
{

private $name;

private $surname;

private $email;

private function __construct(string $name, string $surname, string $email)
{
$this->name = $name;
$this->surname = $surname;
$this->email = $email;
}

public static function create(string $name, string $surname, string $email): User
{
return new static($name, $surname, $email);
}

public function fromFormData(FormInterface $form):User
{
// The form validate user input (i.e. valid email address)
return self::create($form->get('name'), $form->get('surname'), $form->get('email'));
}

}

Другим подходом может быть использование DTO или вы можете взглянуть на этот полезный комплект о проверке объекта DTO.

Надеюсь это поможет

1

Другие решения

Xero внедрить службу валидатора в __constructor нет необходимости (т.е. плохой дизайн IMHO) для проверки вашего объекта. Ограничения проверяются на два возможных события:

  • Отправьте данные формы и проверьте $form->isValid() метод см док
  • Непосредственно с помощью validator оказание услуг см док

Использование службы валидатора

На самом деле подтвердить Person объект, используйте validate метод на validator оказание услуг. Работа валидатора проста: прочитать ограничения (@Assert) класса и убедитесь, что данные объекта удовлетворяют этим ограничениям. Если проверка не пройдена, возвращается непустой список ошибок.

В вашем контроллере для exmaple:

$errors = $this->get('validator')->validate($person);

if (count($errors) > 0) {
$errorsString = (string) $errors;
}
1

По вопросам рекламы [email protected]