【问题标题】:Symfony3 how to store user roles in databaseSymfony3如何在数据库中存储用户角色
【发布时间】:2016-10-21 11:24:02
【问题描述】:

Symfony 版本:3.1.3 数据库:MySQL

我有 users 表,其中有一列是 roles(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 

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

【问题讨论】:

  • 你做过调试吗?检查$role$userRole 的值。这应该会告诉你更多。
  • 我没做过这个debug试试这个。
  • 你显示的错误是$user->addRole($userRole);这一行吗?
  • 我认为您的选择类型字段存在问题。您有具有相同布尔值“true”的数组女巫 3 个键。 "Teacher" => true, "Student" => true, "'Parent" => true'' 将 "true" 值替换为 "0","1","2" 我认为这解决了你的问题
  • @AlvinBunk 是的,$user->addRole($userRole); 代码的错误

标签: php mysql doctrine symfony


【解决方案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');

这是表单类型中角色的代码,

$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]

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      编辑#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 示例。

      【讨论】:

      • 我已经尝试过了,它给出了这个错误 注意:数组到字符串的转换 500 Internal Server Error - ContextErrorException Stack Trace in vendor/symfony/symfony/src/Symfony/Component/Form/ChoiceList/ArrayChoiceList.php at line 73 - if (null === $value && $this->castableToString($choices)) { $value = function ($choice) { return false === $choice ? '0' : (string) $choice; }; }
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-13
      相关资源
      最近更新 更多