Вопрос по one-to-many, collections, symfony, validation, doctrine – Доктрина Symfony2 + - Проверка коллекции сущностей один-ко-многим

13

У меня есть форма для создания новой сущности. Эта сущность имеет коллекцию других сущностей, которые также вводятся в этой форме.

Я хочу использовать параметры проверки сущности в коллекции для проверки этих сущностей, но это не работает. Правила валидации «основного» сущность (Person) проверяются, но правила проверки сущностей вaddressList Коллекция (адрес) не проверяется. Когда я вводю неверную информацию в поля, отправленная форма успешно проверяется.

В этом примере аннотация для улицы не используется при проверке.

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

Как я могу получить форму для проверки предоставленных объектов Address?

Я исправил это, добавив'cascade_validation' => true к массивуgetDefaultOptions() PersonType. Bramklg

Ваш Ответ

4   ответа
0

действительный& Quot; ограничение с помощью & quot;Все& Quot; ограничение:

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

protected $addressList;
Не уверен больше. Я думаю, что я использовал 2.0 в то время, и мне пришлось столкнуться с аналогичной проблемой. Если это не сработает, возможно, я должен удалить свой ответ.
У меня была похожая проблема с 3.3 и @Assert \ Valid () без @Assert \ All окружающих, похоже, работает нормально. И, очевидно, избавиться от "... Действительный не может быть вложен в ... Все ..." сообщение об ошибке тоже.
Это больше не работает с 2.6+ наверняка.
Уверены ли вы? Это дает мне & quot; ограничение Valid не может быть вложено в ограничение Symfony \ Component \ Validator \ Constraints \ All. Вы можете объявить ограничение Valid только непосредственно для поля или метода. & Quot; в 2.1
7

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
        );
    }
}
}

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

Также добавьте @Assert \ Valid в $ addressList, и это будет полное решение
5

Просто добавьте аннотацию assert следующим образом

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

/**
 * @ORM\OneToMany(
 *  targetEntity="Entity",
 *  mappedBy="mappedEntity",
 *  cascade={"persist" , "remove"}
 * )
 * @Assert\Valid
 */
Это подтвердит, что каждый адрес из списка является действительным только объектом Address. Но если вы хотите еще несколько проверок, посмотрите на ответ @ sergey-polischook снизу

Похожие вопросы