【问题标题】:Symfony2 get security context in custom validatorSymfony2 在自定义验证器中获取安全上下文
【发布时间】:2012-06-13 03:29:08
【问题描述】:

我正在构建一个自定义验证器。在控制器中,我将使用以下方法获取安全上下文:

$this->get('security.context')->getToken()->getUser()

我无法在自定义验证器中做同样的事情;谁能帮帮我?

非常感谢!

【问题讨论】:

    标签: validation symfony


    【解决方案1】:

    您需要使用您的过滤器类扩展ContainerAware,然后在实例化它时调用该类的 setContainer 或通过容器传递给构造时的类。这是因为过滤器默认情况下不像控制器那样感知容器。

    要通过构造函数来实现,您可以将如下所示的 __construct 方法添加到您的过滤器类中:

    protected $container;
    
    public function __construct($container){
        $this->container = $container;   
    }
    

    无论哪种方式,您都需要在通话中使用容器:

    $this->container->get('security.context')->getToken()->getUser()
    

    查看此链接https://groups.google.com/forum/?fromgroups#!topic/symfony2/WWIc8N7KZrg 以扩展适用于学说实体的容器感知理念,可能会有所帮助。

    编辑

    查看docs for validator,如果它有任何依赖项,您可以添加服务:

    services:
        validator.unique.your_validator_name:
            class: Fully\Qualified\Validator\Class\Name
            tags:
                - { name: validator.constraint_validator, alias: alias_name }
    

    为什么不为容器添加一个参数:

    arguments:  [@security.context] 
    

    然后使用construct方法?

    protected $security_context;
    
    public function __construct($security_context){
        $this->security_context = $security_context;   
    }
    

    【讨论】:

    • 注入整个容器是个坏主意。只注入你需要的那些服务——单独注入。
    • 非常感谢您的回答。这对于我正在尝试做的事情来说有点复杂,所以我将验证逻辑放在控制器中。
    • @elnur 我读了这个stackoverflow.com/questions/7561013/…,不确定你是否能得到security.context。你觉得你能做到吗["@security.context"]
    • 是的,你可以这样做。但我不使用引号,所以它就像这样:[@security.context]
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多