Symfony2 / 3子实体约束断言被忽略

时间:2016-04-20 10:36:26

标签: symfony doctrine-orm

我有一种情况,实体类中的验证约束被忽略......

这个不起作用(它是ActivityField Entity的子代):

<?php
namespace XXX\ActivityFieldsBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use XXX\DatabaseBundle\Entity\AbstractEntity;
use Symfony\Component\Validator\Constraints as Assert;

/**
 * @ORM\Entity(repositoryClass="XXX\ActivityFieldsBundle\Repository\ActivityFieldLanguagesRepository")
 * @ORM\HasLifecycleCallbacks
 * @ORM\Table(name="activity_field_languages")
 */
class ActivityFieldLanguages extends AbstractEntity
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @ORM\Column(name="name", type="text")
     * @Assert\NotBlank()    ----> !!! this one here !!!
     */
    protected $name;

虽然这个(它是独立的,与其他实体没有任何连接)有效:

<?php

namespace XXX\LanguagesBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use XXX\DatabaseBundle\Entity\AbstractEntity;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
use XXX\CommonBundle\Validator\Constraints as SiteAssert;
use Symfony\Component\Validator\Constraints as Assert;

/**
 * @ORM\Entity(repositoryClass="XXX\LanguagesBundle\Repository\LanguagesRepository")
 * @ORM\HasLifecycleCallbacks
 * @ORM\Table(name="languages")
 *
 * @UniqueEntity(fields="name")
 * @UniqueEntity(fields="iso")
 */
class Languages extends AbstractEntity
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @ORM\Column(name="name", type="string", unique=true)
     * @Assert\NotBlank() -----> this one here !!!
     * @Assert\Length(
     *     min=2,
     *     minMessage="validator.minimum.2.characters"
     * )
     */
    protected $name;

如果我在FormType中添加约束,那么一切正常并且正常工作但我不想拥有它并将实体文件中的所有内容保留为注释。 在我的配置文件中,我有

framework:
    validation:      { enable_annotations: true }

2 个答案:

答案 0 :(得分:3)

要将验证“传递”到子表单类型,您需要将@Assert\Valid添加到父类型。

如果与Doctrine实体有关,如果ActivityFieldLanguages是一个让我们说ActivityField的子实体,那么父母应该标记该关系以进行验证。

/**
 * @var ActivityFieldLanguages[] $activityFieldLanguages
 * @Assert\Valid()
 */
protected $activityFieldLanguages;

如果您想直接在FormType中执行此操作,则应将相同的约束添加到(可能)CollectionType

$formBuilder->add('activityFieldLanguages', CollectionType::class, array(
    // ...
    'constraints' => new Valid()
);

了解更多信息:http://symfony.com/doc/current/reference/constraints/Valid.html

答案 1 :(得分:0)

可能是您拥有验证组,而且名称是&#39;该组中不包含您可能在表单中使用的组。这可能会导致这种逻辑错误。