如何在超薄框架3上创建中间件?

2022-06-13 00:00:00 php slim slim-3

我阅读了关于创建中间件的文档here。但是我必须使用哪个文件夹或文件来创建它呢?文档不包含此信息。

在src文件夹下,我有middleware.php

例如,我希望获得如下帖子信息:

$app->post('/search/{keywords}', function ($request, $response, $args) {
    $data = $request->getParsedBody();
    //Here is some codes connecting db etc...
    return json_encode($query_response);
});

我是在routes.php下创建的,但我想为此创建类或中间件。我能做些什么?我必须使用哪个文件夹或文件。


解决方案

Slim3不会将您绑定到特定的文件夹结构,但它确实(相反)假定您使用Composer并使用其中一个Psr文件夹结构。

就我个人而言,这就是我使用的(好吧,简化版本):

在我的索引文件/www/index.php:

include_once '../vendor/autoload.php';

$app = new MySlimApplication(include '../DI/services.php', '../config/slim-routes.php');
$app->run();

在/src/my/Slim/Application.php:

class Application extends SlimApp
{
    function __construct($container, $routePath)
    {
        parent::__construct($container);

        include $routePath;
        $this->add(new ExampleMiddleWareToBeUsedGlobally());

    }
}

我在DI/services.php中定义了所有依赖项注入,在config/slm-routes.php中定义了所有路由定义。请注意,由于我在应用程序构造函数中包含了路由,因此它们将使$this引用包含文件中的应用程序。

然后在DI/services.php中,您可以拥有类似

$container = new SlimContainer();
$container['HomeController'] = function ($container) {
    return new MySlimControllerHomeController();
};
return $container;

在配置/slm-routes.php中类似

$this->get('/', 'HomeController:showHome'); //note the use of $this here, it refers to the Application class as stated above
最后是您的控制器/src/My/Slim/Controller/HomeController.php

class HomeController extends MySlimControllerAbstractController
{
    function showHome(ServerRequestInterface $request, ResponseInterface $response)
    {
        return $response->getBody()->write('hello world');
    }
}

另外,返回json的最佳方式是使用return $response->withJson($toReturn)

相关文章