实体字段Symfony2上的约束NotBlank / NotNull

时间:2015-07-23 13:03:24

标签: forms symfony entity constraints

我有一个用户实体。每个用户都可以属于一个域。

class User extends BaseUser implements DomainableInterface
{
    …

    /**
    * @var Domain
    *
    * @ORM\ManyToOne(targetEntity="Domain", inversedBy="users")
    * @ORM\JoinColumns({
    *   @ORM\JoinColumn(name="domain_id", referencedColumnName="id")
    * })
    */
    private $domain;

    …
}

当我创建用户时,我希望域是必需的。这是表单(它是一个超级类,因为许多其他实体将属于一个域),User表单继承自那个

abstract class HasDomainFormType extends AbstractType
{
    private $user;

    public function __construct($securityContext)
    {
        $this->user = $securityContext->getToken()->getUser();
    }

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $user = $this->user;
        $builder
            ->add('domain', 'entity', array(
                    'class'    => 'AppBundle:Domain',
                    'property' => 'id',
                    'multiple' => false,
                    'query_builder' => function(DomainRepository $er) use ($user) {
                        if (!in_array('ROLE_SUPER_ADMIN', $user->getRoles())) {
                            return $er->createQueryBuilder('d')
                                    ->andWhere('d.id = :domainId')
                                    ->setParameter('domainId', $user->getDomain()->getId());
                        } else {
                            return $er->createQueryBuilder('d');
                        }
                    },
                )
            )
        ;
    }
}

这是validation.xml文件

    <class name="AppBundle\Entity\User">
      <property name="domain">
          <constraint name="NotNull">
              <option name="message">fos_user.domain.blank</option>
              <option name="groups">
                  <value>Update</value>
              </option>
          </constraint>
        </property>
    </class>

当我提交省略域名的表单(它是Rest API)时,我收到此错误:

An exception occurred while executing 'SELECT b0_.id AS id0, b0_.name AS name1, b0_.enabled AS enabled2 FROM bo_domain b0_ WHERE b0_.id IN (?)' with params [""]:
SQLSTATE[22P02]: Invalid text representation: 7 ERROR:  invalid input syntax for integer: ""

但如果我填写域名字段,一切正常。

我不明白为什么。我希望该表单告诉我“域”字段不能为空。

编辑:我这样做时出错

$form->handleRequest($request);

不在

$form-isValid();

1 个答案:

答案 0 :(得分:0)

我无法使它工作,所以我做了一个解决方法。

abstract class HasDomainFormType extends AbstractType
{
    private $user;
    private $domainManager;

    public function __construct($securityContext, $domainManager)
    {
        $this->user = $securityContext->getToken()->getUser();
        $this->domainManager = $domainManager;
    }

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $user = $this->user;

        $arrchoice = $this->domainManager->getDomainForUser($user);
        $builder
            ->add('domain', 'entity', array(
                    'class'    => 'AppBundle:Domain',
                    'property' => 'id',
                    'multiple' => false,
                    'choices'  => $arrchoice
                )
            )
        ;
    }
}

我没有使用query_builder选项,而是在构建表单之前使用DomainManager获取所需的所有选项,并在choices选项中使用它们。

感谢@Jovan Perovic,我想我知道问题所在,尽管我还没有测试过。 我正在使用此表单创建用户,因此这是控制器中的行

$form = $this->createForm(new UserFormType(), $user);

我的猜测是参数中的$user变量会覆盖我在$user选项中的FormType中使用的query_builder变量。由于它是新用户,因此没有域名。

如果我有时间,我会尝试将表单中的$user重命名为$currentUser,看看是否有效。