Pregunta sobre validation, collections, one-to-many, doctrine, symfony – Symfony2 + Doctrine - Validando una colección de entidades de uno a muchos

13

Tengo un formulario para crear una nueva entidad. Esa entidad tiene una colección de otras entidades que también se ingresan en esa forma.

Quiero usar las opciones de validación de la entidad en la colección para validar esas entidades pero no funciona. Las reglas de validación de la entidad "principal" (Persona) se verifican, pero las reglas de validación de las entidades en laaddressList colección (Dirección) no están marcados. Cuando ingreso información no válida en los campos, el formulario enviado se valida con éxito.

En este ejemplo, la anotación para la calle no se utiliza en la validación.

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

¿Cómo puedo obtener el formulario para validar las entidades de dirección proporcionadas?

Arreglé esto agregando'cascade_validation' => true a la matriz degetDefaultOptions() del tipo de persona. Bramklg

Tu respuesta

4   la respuesta
14

Tuve el mismo problema pero se resolvió con:

<code>/**
 * @ORM\OneToMany(
 *  targetEntity="Entity",
 *  mappedBy="mappedEntity",
 *  cascade={"persist" , "remove"}
 * )
 * @Assert\Valid
 */
</code>
@Assert\Valid hace que valide todas las restricciones en el lado ManyToOne de la colección y es exactamente lo que necesitaba. Armel Larcier
Esto validará que cada dirección de la lista solo sea válida como entidad de dirección. Pero si quieres más validaciones, mira la respuesta de @ sergey-polischook desde abajo Jekis
7

Yo uso esto:

<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

También agregue @Assert \ Valid a $ addressList y será la solución completa Jekis
0

También puedes usar el "Válido"restricción con el"Todos"restricción:

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

protected $addressList;
</code>
Ya no estoy seguro. Creo que estaba usando 2.0 en ese momento y tuve que lidiar con un problema similar. Si no funciona tal vez debería eliminar mi respuesta. Julien
¿Estás seguro? Esto me da "La restricción Válida no se puede anidar dentro de la restricción Symfony \ Component \ Validator \ Constraints \ All. Solo puedes declarar la restricción válida directamente en un campo o método". en 2.1 nurikabe
Tuve un problema similar con 3.3 y @Assert \ Valid () sin que @Assert \ All a su alrededor funcione bien. Y, obviamente, deshacerse del mensaje de error "... Válido no se puede anidar dentro de ... Todos ...". Andy Preston
Esto ya no funciona con 2.6+ seguro. tftd
5

Solo agrega una anotación como si siguiera

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

Preguntas relacionadas