如何覆盖注册表单FosUser和选择字段填充角色SYMFONY2



我按照文档重写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();

最新更新