首页 > 解决方案 > 如何在 Symfony4 中返回选民的额外信息?

问题描述

我有一个选民,我用它来检查当前用户是否可以访问一个对象。访问被拒绝有几个原因,我想知道控制器中的哪个。但是,投票者只能返回一个布尔值,与控制器中的 isGranted() 相同,所以我不确定我可以通过哪个通道传递我想要的额外信息。抛出异常是不行的,因为可能还有其他选民尚未被召集。

我能想到的更接近的事情是 Flash 消息,它可以用来在函数参数和返回值之外传递信息,但在这种情况下使用它们感觉就像 hack。

标签: symfonysymfony4symfony4-voter

解决方案


您可以像使用 LoggerInterface 一样将它们登录到服务中,但可以登录到您自己的简单数据收集服务中。

在 Symfony 容器中,服务默认是“单例”——从多个地方获取的同一个服务是同一个对象(比如记录器)。创建一个简单的服务来积累信息可以稍后检查。

已经有一些可用的服务可以用于此 - 例如从堆栈中获取当前请求,并将新项目添加到参数包之一中。

<?php
class ServiceName
{
    private $requestStack;
    public function __construct(RequestStack $requestStack) {
        $this->requestStack = $requestStack;
        $requestStack->getCurrentRequest()->attributes->set('simple-store', 'blah');
        //OR, set it in a method that is called deep in the system
    }

// And now in a controller
// $value = $request->attributes->get('simple store'),
// Or in Twig template: `{{ dump(app.request.get('simple store')) }}`:

但是,您自己的“原因收集服务”可能会更干净。


推荐阅读