Symfony3如何在数据库中存储用户角色

时间:2016-08-29 05:10:16

标签: php mysql doctrine symfony

Symfony版本:3.1.3 数据库:MySQL

我有users表,它有一列角色(LongText-DC2Type:array)。

在我的控制器中,我为表格创建了一个下拉框,如下所示

$user = new Users;
$form = $this->createFormBuilder($user)
        // some other fields
        ->add('roles', ChoiceType::class, array(
                    'attr'  =>  array(
                            'class' => 'form-control',
                            'style' => 'margin:5px 0;'),
                    'choices'  => array(
                            'Teacher'   => true,
                            'Student'   => true,
                            'Parent'    => true
                    ),
        ) )
        // some other fields
        ->getForm();

然后我将用户选择的角色设为下方(在同一控制器内)

if( $form->isSubmitted() && $form->isValid() ){
    // some other codes
    $role   = $form['roles']->getData();
    // some other codes

    if( $role == 0 ){
        $userRole = array ('teacher');
    }
    elseif( $role == 1 ){
        $userRole = array ('student');
    }
    elseif( $role == 2 ){
        $userRole = array ('parent');
    }

    $user->addRole($userRole);

    $em = $this->getDoctrine()->getManager();
    $em->persist($user);
    $em->flush();
}

但是这给了我以下错误,

Expected argument of type "array", "boolean" given 

我认为我的做法是错误的,并且想知道将角色插入数据库的正确方法。

3 个答案:

答案 0 :(得分:1)

以下是我解决问题的方法,

在/app/config/security.yml中定义角色,如下所示,

role_hierarchy:
    ROLE_ADMIN:         [ROLE_ADMIN]
    ROLE_SUPER_ADMIN:   [ROLE_SUPER_ADMIN, ROLE_ALLOWED_TO_SWITCH]
    ROLE_TEACHER:       [ROLE_TEACHER]
    ROLE_STUDENT:       [ROLE_STUDENT]
    ROLE_PARENT:        [ROLE_PARENT]
在Controller中,使用以下代码从/app/config/security.yml获取角色

$roles = $this->getParameter('security.role_hierarchy.roles');

这是formtype中的角色代码,

$roles = $this->getParent('security.role_hierarchy.roles');

然后在formtype中,(这里是多选)

->add('roles', ChoiceType::class, array(
    'attr'  =>  array('class' => 'form-control',
    'style' => 'margin:5px 0;'),
    'choices' => 
    array
    (
        'ROLE_ADMIN' => array
        (
            'Yes' => 'ROLE_ADMIN',
        ),
        'ROLE_TEACHER' => array
        (
            'Yes' => 'ROLE_TEACHER'
        ),
        'ROLE_STUDENT' => array
        (
            'Yes' => 'ROLE_STUDENT'
        ),
        'ROLE_PARENT' => array
        (
            'Yes' => 'ROLE_PARENT'
        ),
    ) 
    ,
    'multiple' => true,
    'required' => true,
    )
)

修改 用户角色必须在/app/config/security.yml中定义,如下所示

role_hierarchy:
    ROLE_ADMIN:         [ROLE_ADMIN]
    ROLE_SUPER_ADMIN:   [ROLE_SUPER_ADMIN, ROLE_ALLOWED_TO_SWITCH]
    ROLE_TEACHER:       [ROLE_TEACHER]
    ROLE_STUDENT:       [ROLE_STUDENT]
    ROLE_PARENT:        [ROLE_PARENT]

答案 1 :(得分:0)

如果用户只能拥有一个角色,您的角色值可能会直接作为数组选择中的键。

'choices' => array(
    'Teacher' => ['teacher'],
    'Student' => ['student'],
    'Parent'  => ['parent'],
)

答案 2 :(得分:0)

编辑#2

我查看了自己的代码,我给了你错误的信息。 将其更改为以下内容。 请注意,从表单获取角色的方式不正确,请使用以下解决方案。我相当肯定这会对你有用。

->add('roles', ChoiceType::class, array(
        'attr'  =>  array(
                'class' => 'form-control',
                'style' => 'margin:5px 0;'),
        'choices'  => array(
                'Teacher'   => 0,
                'Student'   => 1,
                'Parent'    => 2,
        ),
))


if( $form->isSubmitted() && $form->isValid() ){
    // some other codes
    $role   = $form->get('roles')->getData();
    ...

@dragoste做了一个正确的陈述,你应该在发布问题之前先尝试一些故障排除。您也可以在线搜索答案。有很多Symfony例子可供使用。