我有一个用户实体。每个用户都可以属于一个域。
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();
答案 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
,看看是否有效。