symfony - 如何在 Symfony4 中返回选民的额外信息?
问题描述
我有一个选民,我用它来检查当前用户是否可以访问一个对象。访问被拒绝有几个原因,我想知道控制器中的哪个。但是,投票者只能返回一个布尔值,与控制器中的 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')) }}`:
但是,您自己的“原因收集服务”可能会更干净。
推荐阅读
- mathematical-optimization - 具有最大日长和特定节点开始/结束日的旅行推销员问题
- c# - 读取zip文件中的json文件,无需远程解压
- scons - 为什么我不能从伪构建器 (AddMethod) 中修改构建环境?
- common-lisp - 如何获取 Quicklisp 提供的每个系统的所有依赖项列表?
- python - 如何使用 Python 中的 Pillow 在图片上添加单词并将其中一个加粗?
- reactjs - 尝试将部署推送到 Firebase 托管合并到主分支并给我一个错误:进程完成,退出代码 254
- angular - Angular,woocommerce,wordpress JWT AUTH 登录错误,不正确的 200 OK 来自服务器的响应可能破坏登录尝试
- javascript - 从 json javascript 获取数据
- opengl - 如何允许用户为 openGL 软件自定义着色器
- python - 如何解开 pyparsing 辅助函数的结果?