Kur*_*zyx 1 php symfony symfony-2.7
我一直在寻找这个问题的答案,但似乎在任何地方都找不到。
我目前已经定义了一个装饰器服务来装饰翻译器服务。但是,我只想在用户具有特定角色时装饰翻译服务。
服务.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...
}
容器在运行时之前“编译”。您不能根据上下文装饰服务,它总是会被装饰。
但是,在您的装饰器中,您可以添加一个保护子句,以便在没有必要时不执行您的自定义代码。
服务定义:
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
}
| 归档时间: | 
 | 
| 查看次数: | 988 次 | 
| 最近记录: |