【问题标题】:Constraint NotBlank/NotNull on Entity field Symfony2约束实体字段 Symfony2 上的 NotBlank/NotNull
【发布时间】:2015-07-23 13:03:24
【问题描述】:

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

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;

    …
}

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

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

【问题讨论】:

  • 我的第一个想法是看看为什么$user-&gt;getDomain()-&gt;getId() 返回""。如果user 是认证用户,是否分配了域?
  • 我找到了另一种方法。我想我找到了问题的原因。我会发布答案

标签: forms symfony entity constraints


【解决方案1】:

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

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 变量覆盖了我在query_builder 选项中的FormType 中使用的$user 变量。由于是新用户,所以没有域。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-23
    • 2012-11-10
    • 1970-01-01
    • 1970-01-01
    • 2021-02-24
    相关资源
    最近更新 更多