如何在 Symfony4 中返回选民的额外信息?

问题描述 投票:0回答:2

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

我能想到的最接近的东西是闪存消息,它可以用来在函数参数和返回值之外传递信息,但在这种情况下使用它们感觉就像黑客。

symfony symfony4 symfony-voter
2个回答
1
投票

您可以将它们登录到服务中,就像使用 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')) }}`:

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


0
投票

我所做的是直接从选民那里

throw new AccessDeniedHttpException('reason');

我的工作方式与 symfony 相同,或者如果投票者返回 false,则

denyUnlessGranted()
会抛出相同的异常。

但缺点是:

  • 它迫使你使用
    unanimous
    策略
  • 选民不会显示在探查器中的“安全”>“访问决策”选项卡中。
© www.soinside.com 2019 - 2024. All rights reserved.