我刚刚用自己的设置安装了一个新的slim via composer。非常简单的index.php,里面很少:
<?php
use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
use Slim\Factory\AppFactory;
require_once __DIR__ . '/../bootstrap.php';
// start the app
$APP = AppFactory::create();
/**
* Middleware to check validation before any routes
*/
$APP->add(function(Request $request, Response $response, callable $next){
$response = $next($request,$response);
return $response;
});
/**
* Add routes
*/
$APP->get('/test',function(Request $request, Response $response, array $args){
return $response->getBody()->write('hello');
});
// run the app
$APP->run();
字符串
Php出现了一个奇怪的错误:
**致命错误:未捕获的类型错误:参数2传递到{闭包}()必须是Psr\Http\Message\ResponseInterface的示例,给定的Slim\Routing\RouteRunner的示例,在/var/www/vendor/slim/slim/Slim/MiddlewareDispatcher. php第275行调用,并在/var/www/public/index.php中定义:16堆栈跟踪:#0 /var/www/vendor/slim/slim/Slim/MiddlewareDispatcher.php(275):{close}(Object(Slim\Psr7\Request),Object(Slim\Routing\RouteRunner))
1 /var/www/vendor/slim/slim/Slim/MiddlewareDispatcher.php(73):class@anonymous->handle(Object(Slim\Psr7\Request))#2
/var/www/vendor/slim/slim/Slim/App.php(206):Slim\MiddlewareDispatcher->handle(Object(Slim\Psr7\Request))#3 /var/www/vendor/slim/Slim/App.php(190):Copyright © 2018 - 2019 www.slive.com All Rights Reserved版权所有Slim\App->run()#5 {main}抛出/var/www/public/index. php上线16**
我不明白为什么它说这里的基本中间件是采用Slim\Routing\RouteRunner的示例,而我明明给它的是Psr\Http\Message\ResponseInterface
你知道吗?
编辑:
感谢delboy的回答,但你能更具体一点吗?slim文档展示了如何像这样使用它(http://www.slimframework.com/docs/v3/concepts/middleware.html):
$app->add(function ($request, $response, $next) {
$response->getBody()->write('BEFORE');
$response = $next($request, $response);
$response->getBody()->write('AFTER');
return $response;
});
型
但这不管用!总是得到类型错误,那么他们的文档是不是过时了?如果是这样,我如何在这里实现中间件?
他们给予的这个示例代码还产生了另一个奇怪的错误:
Fatal error: Uncaught ArgumentCountError: Too few arguments to function {closure}(), 2 passed in /var/www/vendor/slim/slim/Slim/MiddlewareDispatcher.php on line 275 and exactly 3 expected in /var/www/public/index.php:26 Stack trace: #0 /var/www/vendor/slim/slim/Slim/MiddlewareDispatcher.php(275): {closure}(Object(Slim\Psr7\Request), Object(class@anonymous)) #1 /var/www/vendor/slim/slim/Slim/MiddlewareDispatcher.php(73): class@anonymous->handle(Object(Slim\Psr7\Request)) #2 /var/www/vendor/slim/slim/Slim/App.php(206): Slim\MiddlewareDispatcher->handle(Object(Slim\Psr7\Request)) #3 /var/www/vendor/slim/slim/Slim/App.php(190): Slim\App->handle(Object(Slim\Psr7\Request)) #4 /var/www/public/index.php(38): Slim\App->run() #5 {main} thrown in /var/www/public/index.php on line 26
型
示例代码传递了3个参数,而不是2个!
编辑:
好了,Slim文档显然已经过时了,应该这样做:
$app->add(function(ServerRequestInterface $request, RequestHandlerInterface $handler) {
$response = new Response();
$response->getBody()->write('STUFF');
return $response;
});
型
3条答案
按热度按时间qrjkbowd1#
您的中间件没有实现PSR-15。你不应该传递一个响应,而是一个请求处理器接口:
字符串
https://www.php-fig.org/psr/psr-15/
cwxwcias2#
需要添加:使用Slim\Psr7\Response;
63lcw9qa3#
首先你需要检查你使用的是哪个精简版本,当我开始学习的时候,我也遇到了这个错误/问题,但是你想解决这个问题,你可以在你的代码中进行编辑。
字符串