如何在 Symfony4 中 return 来自选民的额外信息?

How to return extra information from a voter in Symfony4?

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

我能想到的更接近的东西是 flash 消息,它可以用来传递函数参数和 return 值之外的信息,但在这种情况下使用它们感觉很糟糕。

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

在 Symfony 容器服务中,默认情况下,'singletons' - 从多个地方获取的相同服务是相同的对象(如记录器)。创建一个简单的服务来积累信息,以后再研究。

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

<?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')) }}`:

不过您自己的 'reason-collecting service' 可能会更干净。