Traverse
Дата оновлення перекладу 2023-09-25
Traverse
Властивості обʼєкта валідуються тільки якщо до них є доступ або через їх публічність, або через наявність методів публічного доступу (наприклад, публічний гетер). Якщо ваш обʼєкт має бути траверсований для валідації своїх даних, ви можете використати це обмеження.
????????????? ?? | ????? |
???? | Traverse |
Базове застосування
У наступному прикладі, створіть два класи - BookCollection
та Book
, які
мають всі обмеження у своїх властивостях.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
// src/Entity/BookCollection.php
namespace App\Entity;
use App\Entity\Book;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
#[ORM\Entity]
#[Assert\Traverse]
class BookCollection implements \IteratorAggregate
{
/**
* @var string
*/
#[ORM\Column]
#[Assert\NotBlank]
protected string $name = '';
/**
* @var Collection|Book[]
*/
#[ORM\ManyToMany(targetEntity: Book::class)]
protected ArrayCollection $books;
// some other properties
public function __construct()
{
$this->books = new ArrayCollection();
}
// ... сетер для імені, адер та ремувер для книг
// the name can be validated by calling the getter
public function getName(): string
{
return $this->name;
}
/**
* @return \Generator|Book[] Книги для заданого автора
*/
public function getBooksForAuthor(Author $author): iterable
{
foreach ($this->books as $book) {
if ($book->isAuthoredBy($author)) {
yield $book;
}
}
}
// ані метод зверху, ані будь-який інший спеціальний гетер не
// можуть бути використані для валідації усіх вкладених книг;
// цей обʼєкт має бути траверсовано для виклику ітератора
public function getIterator(): \Iterator
{
return $this->books->getIterator();
}
}
Коли обʼєкт реалізує \Traversable
(як тут з дочірнім \IteratorAggregate
),
його стратегія траверсування буде задана неясно і обʼєкт буде ітеровано без
визначення обмеження.
Це найбільш корисно для додавання ясності або для відключення траверсування,
використовуючи опцію traverse
.
Якщо публічний гетер існує для повернення внутрішньої колекції книг, як
getBooks(): Collection
, обмеження Valid може
бути використано у властивості $books
, натомість.
Опції
Опція groups
option is not available for this constraint.
traverse
тип: boolean
за замовчуванням: true
Екземпляри \Traversable
траверсуються за замовчуванням, використайте цю
опцію, щоб відключити валідацію:
1 2 3 4 5 6 7 8 9 10 11 12
// src/Entity/BookCollection.php
// ... те ж саме, що і вищу
/**
* ...
*/
#[Assert\Traverse(false)]
class BookCollection implements \IteratorAggregate
{
// ...
}
Дата оновлення перекладу 2024-05-29
payload
тип: mixed
за замовчуванням: null
Ця опція може бути використана, щоб додати довільні дані, специфічні для домену, до обмеження. Сконфігуроване корисне навантаження не використовується компонентом Validator, але його обробка повністю залежить від вас.
Наприклад, ви можете захотіти використати декілька рівнів помилок, щоб представити неуспішні обмеження по-різному у фронтенді, залежно від серйозності помилки.