2016-05-21 10 views
0

これは私が昨日尋ねたReferencing non-parameter entries in config.ymlの質問のフォローアップです。分散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 

しかし、提示ソリューションは、group.ymlsecurity.role_hierarchychoicesをリンクし、それだけでROLE_GROUP_*役割を参照していますので、同じように。 には、security.role_hierarchyのマージ値が提供され、ROLES_USER_*ROLES_GROUP_*、およびその他すべての定義された役割があるようにしたいと思います。

これは可能ですか?

+1

スカラーの先頭にある '&'と '*'は、YAMLのアンカーとエイリアスのために予約されています。これらは同じ文書内に存在しなければなりません(ファイル内に複数の文書がありますが、 YAML文書)。ほとんどのYAMLパーサでは、アンカー名で要素を見つけることさえできません(round_tripモードで実行しているときはPythonのruamel.yamlパーサーが例外です)。 symfony2はこの構文を使用してこれを解決することはできませんが、異なるYAMLドキュメントからのデータを相互参照する別の方法(構文)を持っている可能性があります。 – Anthon

答えて

1

私はそれを自分でやりました。 @Anthonが言っているように、&*はここでは使用しません。私たちはSymfonyを通してそれをやらなければなりません。ここにあります:

私はsecurity.role_hierarchyを、セキュリティ階層を定義する合併可能なポイントと、アプリケーションで使用されるロールのリストとして使用します。私はそうのように、未定義の選択肢を選択フィールドを残して:

// 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作成をオフに左:

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

は、その後、私は選択肢を設定するには、コントローラにメソッドを使用しますEasyAdminに適しているので、他の場合にはそれを行う別の方法があります。

はそれを行うための別の方法があるかもしれませんが、それは厄介だ:

// 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); 
    // ... 
} 

次に、適切な小枝のテンプレートを更新:それはグローバル変数を小枝するために割り当てるあなたが好きなように、プロセス、コントローラでそれをsecurity.role_hierarchyを取得します。

しかし、私は不必要なグローバルが嫌いですので、広範囲にテストしていません。

+0

これをやり遂げる方法が見つかったらうれしいです、もっと助けてもらえませんでした – Anthon

関連する問題