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, але його обробка повністю залежить від вас.

Наприклад, ви можете захотіти використати декілька рівнів помилок, щоб представити неуспішні обмеження по-різному у фронтенді, залежно від серйозності помилки.