我按照文档重写FosUser的注册表单,并像这样显示我想要的角色。这是我的登记表。
<?php
namespace MyBlogBundleForm;
use MyBlogBundleEntityUser;
use SymfonyComponentFormFormBuilder;
use FOSUserBundleFormTypeRegistrationFormType as BaseType;
class MyRegisterType extends BaseType
{
public function buildForm(FormBuilder $builder, array $options)
{
parent::buildForm($builder ,$options);
$user = new User();
$builder
->add('roles' ,'choice' ,array('choices'=>$user->getRoles() ) ;
}
public function getName()
{
return 'my_register_type';
}
}
这是我的User实体。
<?php
namespace MyBlogBundleEntity;
use FOSUserBundleEntityUser as BaseUser;
use DoctrineORMMapping as ORM;
/**
* MyBlogBundleEntityUser
*
* @ORMTable()
* @ORMEntity(repositoryClass="MyBlogBundleEntityUserRepository")
*/
class User extends BaseUser
{
/**
* @var integer $id
*
* @ORMColumn(name="id", type="integer")
* @ORMId
* @ORMGeneratedValue(strategy="AUTO")
*/
protected $id;
protected $roles=array();
/**
*@ORMOneToMany(targetEntity="Article" ,mappedBy="user")
*/
protected $article;
/**
*@ORMOneToMany(targetEntity="Comment" ,mappedBy="user")
*/
protected $comment;
public function __construct()
{
parent::__construct();
$this->roles=array('searcher' ,'annoucer');
}
}
我现在的问题是我不知道如何在该字段上显示我添加的角色,因为我得到ROLE_USER的选择,当我提交表单时,我得到这个错误
<>之前可捕获的致命错误:参数1传递给FOSUserBundleModelUser::setRoles()必须是一个数组,字符串给定,在/var/www/blog/vendor/symfony/src/Symfony/Component/Form/Util/PropertyPath.php第346行调用,并在/var/www/blog/vendor/bundles/FOS/UserBundle/Model/User.php第709行定义之前任何帮助都将非常感激,谢谢。顺便说一句,我很抱歉我不能添加其他标签:P
我认为你的问题是因为你使用的是ChoiceField
。一个ChoiceField将只返回一个角色(一个字符串类型,这个角色的id),但是方法setRoles
期望一个数组。这意味着您需要添加选项multiple => true
或更改为另一种类型的字段,如Collection
字段。使用multiple
将返回一个setRoles
可以接受的数组,使用Collection
字段也将返回一个数组。
底线是,您需要选择一个返回数组而不是单个结果(字符串)的表单字段。你可以在这里看到所有的表单类型
我也有同样的问题,然后我在控制器中使用这行代码来解决它。
在您的注册表格
->add('roles', 'choice', array(
'mapped' => false,
'required' => true,
'label' => 'User Type',
'choices' => array(
'ROLE_USER' => 'User',
'ROLE_STAFF' => 'Staff',
'ROLE_INSTITUTE' => 'Institute',
),
'expanded' => true,
))
和in控制器
$role = $form->get('roles')->getData();
$user->setRoles(array($role));
$em->persist($user);
$em->flush();