Pytanie w sprawie doctrine, validation, one-to-many, collections, symfony – Symfony2 + Doctrine - Sprawdzanie poprawności kolekcji encji

13

Mam formularz do utworzenia nowego podmiotu. Podmiot ten ma zbiór innych podmiotów, które również są wprowadzane w tej formie.

Chcę użyć opcji sprawdzania poprawności encji w kolekcji do sprawdzenia poprawności tych jednostek, ale nie działa. Sprawdzane są reguły walidacji „głównej” jednostki (Person), ale reguły walidacji jednostek waddressList kolekcja (adres) nie jest zaznaczona. Gdy wprowadzam nieprawidłowe informacje w polach, przesłany formularz jest pomyślnie sprawdzany.

W tym przykładzie adnotacja dla ulicy nie jest używana podczas walidacji.

<code>class Person 
{
    ...

    /**
     * @ORM\OneToMany(targetEntity="Address", mappedBy="owner", cascade={"persist", "detach"})
     */
    protected $addressList;

    ....
}

class Address
{
    ...
    /**
     * @ORM\ManyToOne(targetEntity="Person", inversedBy="addressList")
     * @ORM\JoinColumn(name="person_id", referencedColumnName="id", onDelete="CASCADE")
     */
    protected $owner;

    /**
     * @ORM\Column(type="string", length=75)
     * @Assert\MinLength(
     *     limit=3,
     *     message="Street must have atleast {{ limit }} characters."
     * )
     */
    protected $street;

    ...

}
</code>

Jak mogę uzyskać formularz do sprawdzenia poprawności dostarczonych jednostek adresu?

Naprawiłem to dodając'cascade_validation' => true do tablicygetDefaultOptions() PersonType. Bramklg

Twoja odpowiedź

4   odpowiedź
7

Używam tego:

<code>use Symfony\Component\Validator\ExecutionContextInterface;

class Person 
{
...

/**
 * @ORM\OneToMany(targetEntity="Address", mappedBy="owner", cascade={"persist", "detach"})
 */
protected $addressList;

....

/**
 * @Assert\Callback
 */
public function validate(ExecutionContextInterface $context)
{
    if (!$this->getAddressList()->count()) {
        $context->addViolationAt(
            'addressList',
            'You must add at least one address',
            array(),
            null
        );
    }
}
}
</code>

http://symfony.com/doc/current/reference/constraints/Callback.html

Dodaj także @Assert Prawidłowy do $ addressList i będzie to kompletne rozwiązanie Jekis
14

Miałem ten sam problem, ale został rozwiązany dzięki:

<code>/**
 * @ORM\OneToMany(
 *  targetEntity="Entity",
 *  mappedBy="mappedEntity",
 *  cascade={"persist" , "remove"}
 * )
 * @Assert\Valid
 */
</code>
@Assert\Valid sprawia, że ​​sprawdza wszystkie ograniczenia po stronie ManyToOne kolekcji i jest dokładnie tym, czego potrzebowałem. Armel Larcier
Spowoduje to potwierdzenie, że każdy adres z listy jest poprawny tylko dla jednostki Adres. Ale jeśli chcesz więcej walidacji, spójrz na odpowiedź @ sergey-polischook z dołu Jekis
5

Po prostu dodaj adnotację podobną do następującej

<code>/** 
 * @Assert\Count(
 *      min = "1",
 *      minMessage = "You must specify at least one"
 * )
 * @Assert\Valid 
 * 
 */
protected $name_of_collection_property;
</code>
0

Możesz także użyć „Ważny„ograniczenie z”Wszystko„ograniczenie:

<code>/**
 * @ORM\OneToMany(targetEntity="Address", mappedBy="owner", cascade={"persist", "detach"})
 * @Assert\All({
 *     @Assert\Valid
 * })
 */

protected $addressList;
</code>
Jesteś pewny? Daje mi to „Ograniczenie Prawidłowe nie może być zagnieżdżone wewnątrz ograniczenia Symfony Komponent Walidator Ograniczenia Wszystkie Można zadeklarować poprawne ograniczenie bezpośrednio na polu lub metodzie”. w 2.1 nurikabe
Miałem podobny problem z 3.3 i @Assert Valid () bez @Assert Każdy otaczający go wydaje się działać dobrze. I oczywiście pozbyć się również komunikatu o błędzie „... Nie można zagnieździć wewnątrz ... Wszystkie ...”. Andy Preston
To już nie działa z 2.6+ na pewno. tftd
Już nie jestem pewien. Myślę, że w tym czasie korzystałem z 2.0 i musiałem poradzić sobie z podobnym problemem. Jeśli to nie zadziała, może powinienem usunąć moją odpowiedź. Julien

Powiązane pytania