![](/img/trans.png)
[英]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.