我有一个选民,我用它来检查当前用户是否可以访问一个对象。访问被拒绝有几个原因,我想知道控制器中的哪个。但是,投票者只能返回一个布尔值,与控制器中的 isGranted() 相同,所以我不确定我可以通过哪个通道传递我想要的额外信息。抛出异常是不行的,因为可能还有其他选民尚未被召集。
我能想到的更接近的事情是 Flash 消息,它可以用来在函数参数和返回值之外传递信息,但在这种情况下使用它们感觉就像 hack。
我有一个选民,我用它来检查当前用户是否可以访问一个对象。访问被拒绝有几个原因,我想知道控制器中的哪个。但是,投票者只能返回一个布尔值,与控制器中的 isGranted() 相同,所以我不确定我可以通过哪个通道传递我想要的额外信息。抛出异常是不行的,因为可能还有其他选民尚未被召集。
我能想到的更接近的事情是 Flash 消息,它可以用来在函数参数和返回值之外传递信息,但在这种情况下使用它们感觉就像 hack。
您可以像使用 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')) }}`:
但是,您自己的“原因收集服务”可能会更干净。