在分布式config.yml中引用非参数条目

时间:2016-05-21 10:04:33

标签: symfony reference yaml config

这是我昨天问过的Referencing non-parameter entries in config.yml问题的后续行动。

假设我们有更复杂的情况,每个实体都有一个.yml配置文件。在每个中都有security.role_hierarchy设置,其中包含与该实体相关的角色层次结构。像这样:

#user.yml
security:
    role_hierarchy: &srh
        ROLE_USER_SHOW: ~
        ROLE_USER_LIST: ~
        ROLE_USER_NEW: ~
        ROLE_USER_EDIT_OWN: ~
        ROLE_USER_EDIT: ROLE_USER_EDIT_OWN
        ROLE_USER_SOFTDELETE_OWN: ~
        ROLE_USER_SOFTDELETE: ROLE_USER_SOFTDELETE_OWN
        ROLE_USER_DELETE: ~
        ROLE_USER_FLAG: ~
        ROLE_USER_ALL:
            - ROLE_USER_SHOW
            - ROLE_USER_LIST
            - ROLE_USER_NEW
            - ROLE_USER_EDIT
            - ROLE_USER_DELETE
            - ROLE_USER_SOFTDELETE
            - ROLE_USER_FLAG

#group.yml
security:
    role_hierarchy: &srh
        ROLE_GROUP_SHOW: ~
        ROLE_GROUP_LIST: ~
        ROLE_GROUP_NEW: ~
        ROLE_GROUP_EDIT: ~
        ROLE_GROUP_DELETE: ~
        ROLE_GROUP_ALL:
            - ROLE_GROUP_SHOW
            - ROLE_GROUP_LIST
            - ROLE_GROUP_NEW
            - ROLE_GROUP_EDIT
            - ROLE_GROUP_DELETE

easy_admin:
    entities:
        Group:
            form:
                fields:
                    - 
                      property: 'roles' 
                      type: choice
                      type_options: 
                          expanded: true
                          multiple: true
                          choices: *srh

但提供的解决方案仅将choicessecurity.role_hierarchy中的group.yml相关联,因此仅引用ROLE_GROUP_*个角色。 我希望为choices提供security.role_hierarchy的合并值,使其具有ROLES_USER_*ROLES_GROUP_*和所有其他已定义的角色。

这可能吗?

1 个答案:

答案 0 :(得分:1)

所以我自己设法做到了。 正如@Anthon所说,&*在这里毫无用处。我们必须通过Symfony来做到这一点。方法如下:

我使用security.role_hierarchy作为定义安全层次结构的合理点 - 以及应用程序中使用的角色列表。我将选择字段留给未定义的选项,如下所示:

            - 
              property: 'roles' 
              type: choice
              type_options: 
                  expanded: true
                  multiple: true

然后我在控制器中使用一个方法来设置选择:

// AppBundle/Controller/AdminController.php
public function indexAction(Request $request)
{
    $choices = [];$preferred = [];
    $vals = array_keys($this->container->getParameter('security.role_hierarchy.roles'));
    $choices = $vals;
    // actually there is some beautifying of $choices but it's not that important
    // get $formBuilder and...
    $formBuilder->add('roles', ChoiceType::class, ['choices'=>array_combine($choices, $vals), 'multiple'=>true, 'expanded'=>false]);
    return $formBuilder;
}

我停止了$formBuilder创建,因为我是以适合EasyAdmin的方式完成的,所以在其他情况下会有其他方法来实现。

可能还有另一种方法可以做到这一点,但它很麻烦:在控制器中获取security.role_hierarchy,根据需要处理它,然后将其分配给Twig全局变量:

// AppBundle/Controller/AdminController.php
public function indexAction(Request $request)
{
    $vals = array_keys($this->container->getParameter('security.role_hierarchy.roles'));
    $this->container->get('twig')->addGlobal("_security_roles", $vals);
    // ...
}

然后更新适当的Twig模板。

但我不喜欢不必要的全局,所以没有广泛测试它。