Я пытаюсь улучшить себя с учением и делаю лучшие практики.
Я нашел хорошую презентацию лучших практик: 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);
}
Это хорошая практика или нет? Если нет, то почему?
Спасибо!
Презентация использует лучшие практики как OOP а также ддд Мир.
Принцип, который вы выделяете, касается уровня представления приложения, которое может использовать компонент формы, который может проверять пользовательский ввод затем эти данные используются для создания экземпляра сущности.
В примере представления именованный конструктор принимает в качестве аргумента форму, поэтому проверка адреса электронной почты осуществляется с помощью формы (проверка ввода пользователя).
Значение наличия объекта с допустимое состояние подразумевает наличие объекта типа «Пользователь», который имеет действительное имя, фамилию и адрес электронной почты. (как пример не нуль).
Таким образом, вы можете иметь следующий объект:
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.
Надеюсь это поможет
Xero внедрить службу валидатора в __constructor
нет необходимости (т.е. плохой дизайн IMHO) для проверки вашего объекта. Ограничения проверяются на два возможных события:
$form->isValid()
метод см докvalidator
оказание услуг см докИспользование службы валидатора
На самом деле подтвердить Person
объект, используйте validate
метод на validator
оказание услуг. Работа валидатора проста: прочитать ограничения (@Assert
) класса и убедитесь, что данные объекта удовлетворяют этим ограничениям. Если проверка не пройдена, возвращается непустой список ошибок.
В вашем контроллере для exmaple:
$errors = $this->get('validator')->validate($person);
if (count($errors) > 0) {
$errorsString = (string) $errors;
}