Frage an symfony, collections, doctrine, validation, one-to-many – Symfony2 + Doctrine - Überprüfung einer Eins-zu-Viele-Sammlung von Entitäten

13

Ich habe ein Formular zum Erstellen einer neuen Entität. Diese Entität verfügt über eine Sammlung anderer Entitäten, die ebenfalls in diesem Formular eingegeben werden.

Ich möchte die Validierungsoptionen der Entität in der Auflistung verwenden, um diese Entitäten zu validieren, aber es funktioniert nicht. Die Validierungsregeln der "Haupt" -Entität (Person) werden überprüft, die Validierungsregeln der Entitäten in deraddressList Abholung (Adresse) werden nicht geprüft. Wenn ich ungültige Informationen in die Felder eingebe, wird das übermittelte Formular erfolgreich validiert.

In diesem Beispiel wird die Annotation für Straße bei der Validierung nicht verwendet.

<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>

Wie kann ich das Formular zur Validierung der angegebenen Adressentitäten erhalten?

Ich habe das durch Hinzufügen behoben'cascade_validation' => true zum Array vongetDefaultOptions() des PersonTyps. Bramklg

Deine Antwort

4   die antwort
0

Sie könnten auch die "Gültig"Einschränkung mit der"Alles"Einschränkung:

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

protected $addressList;
</code>
Ich bin mir nicht mehr sicher. Ich glaube, ich habe damals 2.0 verwendet und musste mich mit einem ähnlichen Problem auseinandersetzen. Wenn es nicht funktioniert, sollte ich vielleicht meine Antwort entfernen. Julien
Dies funktioniert mit 2.6+ sicher nicht mehr. tftd
Bist du sicher? Das gibt mir "Die Einschränkung Valid kann nicht in der Einschränkung Symfony \ Component \ Validator \ Constraints \ All verschachtelt werden. Sie können die Gültige Einschränkung nur direkt für ein Feld oder eine Methode deklarieren." in 2.1 nurikabe
Ich hatte ein ähnliches Problem mit 3.3 und @Assert \ Valid () ohne das @Assert \ All Umgebung scheint es gut zu funktionieren. Und natürlich wird auch die Fehlermeldung "... Valid kann nicht in ... All ... verschachtelt werden" entfernt. Andy Preston
7

Ich benutze das:

<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

Fügen Sie auch @Assert \ Valid zu $ ​​addressList hinzu, um die vollständige Lösung zu erhalten Jekis
5

Fügen Sie einfach eine Annotation wie folgt hinzu

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

Ich hatte das gleiche Problem, wurde jedoch gelöst mit:

<code>/**
 * @ORM\OneToMany(
 *  targetEntity="Entity",
 *  mappedBy="mappedEntity",
 *  cascade={"persist" , "remove"}
 * )
 * @Assert\Valid
 */
</code>
Dadurch wird bestätigt, dass jede Adresse aus der Liste nur eine gültige Adressentität ist. Aber wenn Sie weitere Validierungen wünschen, schauen Sie sich die Antwort von @ sergey-polischook von unten an Jekis
@Assert\Valid macht es alle Einschränkungen auf der ManyToOne-Seite der Sammlung zu validieren und es ist genau das, was ich brauchte. Armel Larcier

Verwandte Fragen