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';
 }
}

そして、これが私の User エンティティです。

<?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も取得し、フォームを送信するとこのエラーが発生するため、追加したロールのみをそのフィールドに表示する方法がわからないことです

Catchable Fatal Error: Argument 1 passed to FOS\UserBundle\Model\User::setRoles() must be a array, string given, called in /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 は 1 つのロール (文字列型、ロールのこの ID) のみを返しますが、メソッドsetRolesは配列を想定しています。これは、オプションを追加するかmultiple => true、フィールドなどの別のタイプのフィールドに変更する必要があることを意味しますCollection。Usingmultipleは、受け入れられる配列を返し、フィールドをsetRoles使用すると、配列も返されます。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 に答える