簡體   English   中英

Slim 3框架-將數據從中間件傳遞到控制器-動作args

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM