2017-05-15 8 views
0

私はこの質問に対する答えを探していましたが、どこにも見つからないようです。Symfony:ユーザーがxの役割を持っている場合のサービスのデコレーション

私は現在、翻訳サービスをデコレートするデコレータサービスを定義しています。しかし、私は翻訳者サービスを飾りたいのは、ユーザーが特定の役割を持っている場合だけです。

services.yml

services: 
    app.my_translator_decorator: 
     class: MyBundle\MyTranslatorDecorator 
     decorates: translator 
     arguments: ['@app.my_translator_decorator.inner'] 
     public: false 

MyTranslatorDecorator.php

class MyTranslatorDecorator { 

    /** 
    * @var TranslatorInterface 
    */ 
    private $translator; 

    /** 
    * @param TranslatorInterface $translator 
    */ 
    public function __construct(TranslatorInterface $translator) 
    { 
     $this->translator = $translator; 
    } 

    // more code... 

} 
+0

私はこれが可能だとは思いません。原則として、異なる要求に対してサービス定義を変更することはできません。翻訳サービス内のユーザーの役割を確認し、それに応じて行動する必要があります。 – Cerad

+0

私は頻繁には使われないので、翻訳者を常に「飾る」というデコレータの考え方は好きではありません。デコレータであることに代わるものはありますか? – Kurzalead

答えて

2

コンテナは、実行する前に、 "コンパイル" されます。コンテキストに応じてサービスを飾ることはできません。常に装飾されます。

ただし、デコレータでは、不要な場合にカスタムコードを実行しないようにガード句を追加できます。

サービスの定義:

services: 
    app.my_translator_decorator: 
     class:  AppBundle\MyTranslatorDecorator 
     decorates: translator 
     arguments: ['@app.my_translator_decorator.inner', '@security.authorization_checker'] 
     public: false 

デコレータ:

<?php 

namespace AppBundle; 

use Symfony\Component\Security\Core\Authorization\ AuthorizationCheckerInterface; 
use Symfony\Component\Translation\TranslatorInterface; 

class MyTranslatorDecorator implements TranslatorInterface 
{ 
    private $translator; 
    private $authorizationChecker; 

    public function __construct(TranslatorInterface $translator, AuthorizationCheckerInterface $authorizationChecker) 
    { 
     $this->translator = $translator; 
     $this->authorizationChecker = $authorizationChecker; 
    } 

    public function trans($id, array $parameters = [], $domain = null, $locale = null) 
    { 
     if (!$this->authorizationChecker->isGranted('ROLE_ADMIN')) { 
      return $this->translator->trans($id, $parameters, $domain, $locale); 
     } 

     // return custom translation here 
    } 

    // implement other methods 
} 
+0

セキュリティコンテキストオブジェクトは償却されました。本当にsecurity.authorization_checkerを使用する必要があります – Cerad

+0

@ケラドン良いキャッチ。コードが更新されました。 –