Symfony 2为formtype访问实体数据


Symfony 2 Access entity data for formtype

我正在使用Symfony2制作自己的登录应用程序,我是Symfony的新手。我知道我有FOSUserBundle供我使用,但我想先自己学习安全性。

我的访问控制定义了三个角色:ROLE_SUPER_ADMIN, ROLE_ADMIN和ROLE_USER。此外,定义的角色还有与之关联的其他角色,例如ROLE_ADMIN_VIEW_USERS

我是不是使用安全。实体上的上下文服务。角色从实体映射我的角色,因为我只想影响ROLE_ADMIN和ROLE_USER。注册后,每个用户都被赋予角色ROLE_USER。当一个用户与ROLE_SUPER_ADMIN视图编辑页面的用户或管理员我试图把一个复选框,说"使此用户管理员"。如果他们已经在实体getRoles中有ROLE_ADMIN,该框将被选中。

如果复选框被选中,则在

操作中执行此操作
    if ($editForm->isValid()) {
            $role = ( 'ROLE_ADMIN' === $editForm->get('role')->getViewData())
                    ? "ROLE_ADMIN"
                    : "ROLE_USER";
            $entity->setRoles(array($role));
            $em->flush();
            return $this->redirect($this->generateUrl('admin_new_edit', array('id' => $id)));
        }

所以我的问题是:我如何检查框如果在实体getRoles()是ROLE_ADMIN?请记住,如上所述,角色在实体中是映射的,但角色不是。我不想使用映射实体中的角色,因为安全服务中有几个值是我不想使用的。

    $builder
        ->add('username', 'text')
        ->add('password', 'password')
        ->add('email', 'email')
        ->add('role', 'choice', array(
            'mapped' => false,
            'label' => 'Make Admin',
            'value' => 'ROLE_ADMIN',
            'required' => false,
            //show following attribute only if entity getRoles is ROLE_ADMIN
            //how do i get the value from the entity?
            'attr' => array('checked'=>'checked'),
            ))

我的建议是:

->add('role', 'choice', array(
            'mapped' => true,
            'label' => 'Make Admin',
            'multiple' => true,
            'expanded' => true,
            'choices' => array('ROLE_ADMIN' => 'Yes')
            'required' => false,
            ))

如果实体有一个名为"roles"的属性,该值应该自动从实体中获取,就像其他字段一样。您还可以将其他角色添加到选择数组中,并且您将为每个角色获得一个复选框。

我没有测试,但我希望它的工作