php - Slim 4:是否可以调用带有传递参数的路由中间件?
问题描述
我想使用添加时从路由传递的参数调用路由中间件。这怎么可能?
$app->get('/path', function($request, $response, $lvlreq = 1) {
$oViewParams = new \lib\ViewParams("referencia", "", "", "", "");
$params = array('viewp' => $oViewParams->getMassParams());
return $this->get('view')->render($response, 'some.html', $params);
})->add($authenticate)
->add($tmhasaccess);
第一个中间件不需要参数,一切顺利。
$authenticate = function (Request $request, RequestHandler $handler) {
if (!isset($_SESSION['param'])) {
$routeContext = RouteContext::fromRequest($request);
$route = $routeContext->getRoute();
$redirect = $route->getPattern();
$_SESSION['urlRedirect'] = $redirect;
$this->get('flash')->addMessage('error', 'error');
$response = $handler->handle($request);
return $response->withStatus(302)->withHeader('Location', '/login');
} else {
$response = $handler->handle($request);
return $response;
}
};
$tmhasaccess = function (Request $request, RequestHandler $handler) {
###I need $lvlreq value inside here to work with it. This won't work:
$routeContext = RouteContext::fromRequest($request);
$route = $routeContext->getRoute();
$lvlreq = $route->getArgument('lvlreq');
};
解决方案
中间件改为类:
class TMHasAccessMiddleware
{
protected $lvlreq;
private $container;
function __construct($container, $lvlreq = 0) {
$this->lvlreq = $lvlreq;
$this->container = $container;
}
public function __invoke(Request $request, RequestHandler $handler): Response
{
##$this->lvlreq now accessible.
}
}
可以从路由调用:
->add(new TMHasAccessMiddleware($container, 1));
推荐阅读
- sql - 使用两个表显示最小平均值和标题的 SQL 查询
- grafana - 普罗米修斯与正则表达式查询不匹配
- c - 关于 C 结构中某种类型元素的问题
- excel - 找到基因的确切基因列表并返回 1
- android - 如何将 Socket (Messenger) 添加到后台
- c# - 如何使用 C# 检测从浏览器拖入 WPF 文本框的 URL
- java - 使用拆分 JAVA 解析字符串
- heroku - 不支持 cookie 的应用程序的 heroku session-affinity
- javascript - 如何在 React Native 中使用 StencilJs 组件
- c - 即使在释放内存时也会出现堆溢出