尝试创建一个允许我选择用户角色的表单,但它不起作用。
这是我的用户类:
namespace TestBundle\Entity;
use FOS\UserBundle\Model\User as BaseUser;
use Doctrine\ORM\Mapping as ORM;
/**
* User
*
* @ORM\Table(name="user")
* @ORM\Entity(repositoryClass="TestBundle\Repository\UserRepository")
*/
class User extends BaseUser
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* Get id
*
* @return int
*/
public function getId()
{
return $this->id;
}
}
这是我的表单定义:
class ChangeUserRolesType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$permissions = array(
'ROLE_USER' => 'First role',
'ROLE_CONSULT' => 'Second role',
'ROLE_SUPER_ADMIN' => 'Third role'
);
$builder
->add('username', EntityType::class, array(
'class' => 'TestBundle:User',
'choice_label' => 'username'
))
->add(
'roles',
ChoiceType::class,
array(
'label' => 'Roles',
'choices' => $permissions,
'multiple' => true,
'expanded' => true
)
)
->add(
'save',
SubmitType::class
);
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'TestBundle\Entity\User',
));
}
}
这是我的控制器操作,它会创建表单:
/**
* @Route("/")
*/
public function indexAction()
{
$users = $this->getDoctrine()->getRepository('TestBundle:User')->findAll();
$user = $this->getDoctrine()->getRepository('TestBundle:User')->findOneBy(array('username' => 'liviu'));
$editUserForm = $this->createForm('TestBundle\Form\ChangeUserRolesType', $user);
return $this->render('TestBundle:Default:index.html.twig', array(
'users' => $users,
'form' => $editUserForm->createView()
));
}
但是我收到了这个错误:
警告:缺少FOS \ UserBundle \ Model \ User :: hasRole()的参数1, 呼唤 /home/liviu/apps/app1/vendor/symfony/symfony/src/Symfony/Component/PropertyAccess/PropertyAccessor.php 在第416行和定义500内部服务器错误 - ContextErrorException
有谁知道发生了什么?我在Symfony 3.0上。*
答案 0 :(得分:1)
如果PropertyAccess找不到吸气剂,Fix会使用加法器/ issers。
此外,您应该可以通过在User
实体中添加以下方法来解决此错误:
public function getRoles()
{
parent::getRoles();
}
请注意,您应该添加以下构造函数:
public function __construct()
{
parent::__construct();
}
清除缓存,查找更新数据库架构,它应该可以正常工作。
答案 1 :(得分:0)
我做了完全相同的事情,但我用过:
return $this->roles->toArray();
而不是
parent::getRoles();
因为我无法使用最后一个登录,但是当我尝试在sonata管理包中编辑我的用户时问题仍然存在。