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;
// некоторые другие свойства
public function __construct()
{
$this->books = new ArrayCollection();
}
// ... setter для имени, adder и remover для книг
// имя может быть валидировано путем вызова геттера
public function getName(): string
{
return $this->name;
}
/**
* @return \Generator|Book[] The books for a given author
*/
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
недоступна для этого ограничения.
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-07-25
payload
тип: mixed
по умолчанию: null
Эта опция может быть использована, чтобы добавить к ограничению произвольные данные, относящиеся к домену. Сконфигурированная нагрузка не используется компонентом Валидатор, но его обработка полностью зависит от вас.
Например, вы можете захотеть исользовать несколько уровней ошибок, чтобы представить неудачные ограничения в фронт-энде по-разному, в зависимости от степени сложности ошибки.