为了完整起见,我将扩展@jDolba 给出的出色答案
不幸的是,尽管它让我朝着正确的方向前进,但仍然需要进行一些实验才能让一切正常运行。
基本上,如slim router docs中所述
路由回调签名由路由策略决定。经过
默认情况下,Slim 期望路由回调接受请求、响应、
和一组路由占位符参数。这被称为
请求响应策略。但是,您可以更改预期路线
通过简单地使用不同的策略来回调签名。作为一个
例如,Slim 提供了一种替代策略,称为
RequestResponseArgs 接受请求和响应,加上每个路由
占位符作为单独的参数。这是一个使用这个的例子
替代策略;只需替换 foundHandler 依赖项
默认提供\Slim\Container:
$c = new \Slim\Container();
$c['foundHandler'] = function() {
return new \Slim\Handlers\Strategies\RequestResponseArgs();
};
$app = new \Slim\App($c);
$app->get('/hello/{name}', function ($request, $response, $name) {
return $response->write($name);
});
您可以通过实施
\Slim\Interfaces\InvocationStrategyInterface.
然而,对于将一些标准化数据注入$args[] 数组的任务,默认的\Slim\Handlers\Strategies\RequestResponse 类会完成它所需的一切,而不是注入数据。
因此,我只是扩展了该类:
<?php
namespace MyProject\Handlers\Strategies;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use \Slim\Handlers\Strategies\RequestResponse;
class SomeNewInvocationStrategy extends RequestResponse
{
/**
* Invoke a route callable.
*
* @param callable $callable The callable to invoke using the strategy.
* @param ServerRequestInterface $request The request object.
* @param ResponseInterface $response The response object.
* @param array $routeArguments The route's placholder arguments
*
* @return ResponseInterface|string The response from the callable.
*/
public function __invoke( callable $callable, ServerRequestInterface $request, ResponseInterface $response, array $routeArguments)
{
$routeArguments['test'] = 'testing testing 123';
return parent::__invoke( $callable, $request, $response, $routeArguments );
}
}
我的容器声明如下所示:
<?php
use Slim\App;
return function (App $app) {
$container = $app->getContainer();
$container['foundHandler'] = function() {
return new MyProject\Handlers\Strategies\SomeNewInvocationStrategy();
};
}
然后在我的所有控制器操作中,我都可以访问$args['test']。此外,这可以直接传递到任何 Twig 视图。
这对于访问控制之类的任务很有用,在这些任务中我总是想在处理请求之前加载用户的角色,但我相信它还会有许多其他用例。
我希望这对某人有所帮助。