[英]SLIM FRAMEWORK 3: Can't pass variable from middleware to controller
[英]Slim 3 framework - Passing data from middleware to controller - action args
我正在使用带有slim 3的控制器/中间件版本,并且我希望从附加到组的中间件中将一些数据传递到控制器中的$ args参数-操作。
这是一些代码:
class MyController
{
protected $container;
public function __construct(ContainerInterface $container) {
$this->container = $container;
}
public function index(Request $request, Response $response, $args) {
return $this->container->get('renderer')->render($response, "index.html.twig", $args);
}
}
class MyMiddleware
{
public function __invoke(Request $request, Response $response, $next)
{
// do some stuff to inject further down to $args some data
return $next($request, $response);
}
}
$app->group('/group', function () use ($app){
//routes
})->add(new MyMiddleware());
我的用例是将东西发送到这些控制器的动作所呈现的所有视图中,因此我也可以通过其他方式做到这一点:)
谢谢。
所以您只需要将数据从中间件传递到控制器
关于什么
class MyMiddleware
{
public function __invoke(Request $request, Response $response, $next)
{
$request = $request->withAttribute('myMagicArgument', 42);
return $next($request, $response);
}
}
然后在控制器中
class MyController
{
//...
public function index(Request $request, Response $response) {
$yourAttributeFromMiddleware = $request->getAttribute('myMagicArgument');
//...
}
}
为了完整性,我将扩展给出@jDolba的出色答案
不幸的是,尽管它使我朝着正确的方向前进,但仍然需要进行一些尝试才能使所有功能正常运行。
基本上,如纤薄路由器文档中所述
路由回调签名由路由策略确定。 默认情况下,Slim期望路由回调接受请求,响应以及路由占位符参数数组。 这称为RequestResponse策略。 但是,您可以通过简单地使用其他策略来更改预期的路由回调签名。 例如,Slim提供了一个称为RequestResponseArgs的替代策略,该策略接受请求和响应,并将每个路由占位符作为单独的参数。 这是使用这种替代策略的示例; 只需替换默认
\\Slim\\Container
提供的foundHandler依赖项:
$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视图。
这对于诸如访问控制之类的任务很有用,在该任务中,我总是希望在处理请求之前先加载用户的角色,但是我敢肯定会有很多其他用例。
希望对您有所帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.