4

我按照文档覆盖了 FosUser 的注册表单,并像这样显示我想要的角色。这是我的注册表。

<?php

namespace My\BlogBundle\Form;
use My\BlogBundle\Entity\User; 
use Symfony\Component\Form\FormBuilder;
use FOS\UserBundle\Form\Type\RegistrationFormType 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';
 }
}

这是我的用户实体。

<?php

namespace My\BlogBundle\Entity;

use FOS\UserBundle\Entity\User as BaseUser;
use Doctrine\ORM\Mapping as ORM;

/**
* My\BlogBundle\Entity\User
*
* @ORM\Table()
* @ORM\Entity(repositoryClass="My\BlogBundle\Entity\UserRepository")
*/
class User  extends BaseUser
{
 /**
  * @var integer $id
  * 
  * @ORM\Column(name="id", type="integer")
  * @ORM\Id
  * @ORM\GeneratedValue(strategy="AUTO")
  */
 protected $id;

 protected $roles=array();




/**
 *@ORM\OneToMany(targetEntity="Article" ,mappedBy="user")
 */
protected $article;

/**
 *@ORM\OneToMany(targetEntity="Comment" ,mappedBy="user")
 */
protected $comment;

 public function __construct()
 {
    parent::__construct();
    $this->roles=array('searcher' ,'annoucer');
 }

}

我现在的问题是我不知道如何仅在该字段上显示我添加的角色,因为我还获得了 ROLE_USER 选项,并且当我提交表单时出现此错误

可捕获的致命错误:传递给 FOS\UserBundle\Model\User::setRoles() 的参数 1 必须是一个数组,给定字符串,在 /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

4

2 回答 2

4

我认为您的问题是因为您使用的是ChoiceField. ChoiceField 将仅返回一个角色(字符串类型,角色的此 ID),但该方法setRoles需要一个数组。这意味着您需要添加选项multiple => true或更改为另一种类型的字段,例如Collection字段。usingmultiple将返回一个数组,该数组将被接受,setRoles并且 using 一个Collection字段也将返回一个数组。

最重要的是,您需要选择一个返回数组而不是单个结果(字符串)的表单字段。您可以在此处查看所有表单类型

希望这可以帮助。

于 2011-11-21T14:28:24.730 回答
1

我也有同样的问题,然后我在控制器中使用这行代码来解决它。

在您的注册表中

->add('roles', 'choice', array(
                'mapped' => false,
                'required' => true,
                'label'    => 'User Type',
                'choices' => array(
                    'ROLE_USER' => 'User',
                    'ROLE_STAFF' => 'Staff',
                    'ROLE_INSTITUTE' => 'Institute',
                ),
                'expanded'   => true,
            ))

并在控制器中

    $role = $form->get('roles')->getData();
    $user->setRoles(array($role));
    $em->persist($user);
    $em->flush();
于 2015-11-21T07:37:11.400 回答