我有一个投票器,用于检查当前用户是否可以访问某个对象。 访问可能因多种原因被拒绝,我想知道控制器中的哪些原因。 但是,投票者只能返回一个布尔值,与控制器中的 isGranted() 相同,所以我不确定通过哪个渠道可以传递我想要的额外信息。抛出例外是行不通的,因为可能还有其他选民尚未被召集。
我能想到的最接近的东西是闪存消息,它可以用来在函数参数和返回值之外传递信息,但在这种情况下使用它们感觉就像黑客。
您可以将它们登录到服务中,就像使用 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')) }}`:
不过,您自己的“原因收集服务”可能会更干净。
我所做的是直接从选民那里
throw new AccessDeniedHttpException('reason');
。
我的工作方式与 symfony 相同,或者如果投票者返回 false,则
denyUnlessGranted()
会抛出相同的异常。
但缺点是:
unanimous
策略