Php Symfony:当用户具有x角色时装饰服务

Php Symfony:当用户具有x角色时装饰服务,php,symfony,symfony-2.7,Php,Symfony,Symfony 2.7,我一直在寻找这个问题的答案,但似乎在任何地方都找不到 我目前已经定义了一个装饰器服务来装饰翻译服务。然而,我只想在用户具有特定角色时装饰翻译服务 services.yml services: app.my_translator_decorator: class: MyBundle\MyTranslatorDecorator decorates: translator arguments: ['@app.my_translator_decor

我一直在寻找这个问题的答案,但似乎在任何地方都找不到

我目前已经定义了一个装饰器服务来装饰翻译服务。然而,我只想在用户具有特定角色时装饰翻译服务

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...

}
容器在运行时之前被“编译”。您不能根据上下文来装饰服务,它将始终被装饰

但是,在decorator中,如果没有必要,您可以添加一个guard子句来不执行自定义代码

服务定义:

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
}
在运行时之前,“编译”容器。您不能根据上下文来装饰服务,它将始终被装饰

但是,在decorator中,如果没有必要,您可以添加一个guard子句来不执行自定义代码

服务定义:

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
}

我认为这是不可能的。通常,您不能修改不同请求的服务定义。我很确定你必须检查翻译服务中的用户角色,并采取相应的行动。我不喜欢装饰师总是“装饰”译者的想法,因为它不会被频繁使用。除了当一名装饰师,还有其他选择吗?我认为这是不可能的。通常,您不能修改不同请求的服务定义。我很确定你必须检查翻译服务中的用户角色,并采取相应的行动。我不喜欢装饰师总是“装饰”译者的想法,因为它不会被频繁使用。除了作为装饰器,还有其他选择吗?安全上下文对象已经贬值了。确实应该使用security.authorization\u checker安全上下文对象已贬值。真的应该使用security.authorization\u checker吗