Slim 框架给出了令人困惑的未捕获类型错误

问题描述 投票:0回答:4

我刚刚使用我自己的设置通过 Composer 安装了 slim 的新副本。非常简单的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 给出了一个非常奇怪的错误:

**致命错误:未捕获类型错误:传递给 {closure}() 的参数 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): {闭包}(对象(Slim\Psr7\Request),对象(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(对象(Slim\Psr7\Request)) #3 /var/www/vendor/slim/slim/Slim/App.php(190): Slim\App->handle(对象(Slim\Psr7\Request)) #4 /var/www/public/index.php(34): 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;
});
php slim
4个回答
6
投票

您的中间件未实现 PSR-15。您不应该传递响应,而应该传递请求处理程序接口:

namespace Psr\Http\Server;

use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;

/**
 * Participant in processing a server request and response.
 *
 * An HTTP middleware component participates in processing an HTTP message:
 * by acting on the request, generating the response, or forwarding the
 * request to a subsequent middleware and possibly acting on its response.
 */
interface MiddlewareInterface
{
    /**
     * Process an incoming server request.
     *
     * Processes an incoming server request in order to produce a response.
     * If unable to produce the response itself, it may delegate to the provided
     * request handler to do so.
     */
    public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface;
}

https://www.php-fig.org/psr/psr-15/


0
投票

需要补充: 使用 Slim\Psr7\Response;


0
投票

首先,您需要检查您正在使用哪个 slim 版本,当我开始学习时,我也遇到了这个错误/问题,但您想解决这个问题,您可以在代码中进行此编辑。

$APP = AppFactory::create();
$app->setBasePath("/myapp/public/index.php");

$APP->add(function(Request $request, Response $response, callable $next){
    $response = $next($request,$response);
    return $response;
});

0
投票

我在使用 Slim V4 时也遇到了 OP 的错误。根据此处的文档和包含的回复,我调整了以下内容:

<?php

use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
use Psr\Http\Server\RequestHandlerInterface as RequestHandler;
use Slim\Factory\AppFactory;

require __DIR__ . '/../vendor/autoload.php';

$app = AppFactory::create();

$app->add(function (Request $request, RequestHandler $handler) {

    $response = $handler->handle($request);
    $response->getBody()->write('ADD AUTH');

    return $response;

});

/**
 * Add routes
 */
$app->get('/test', function(Request $request, Response $response, array $args) {

    return $response->getBody()->write('hello');

});

/**
 * Add Error Middleware
 * Note: This middleware should be added last. 
 * It will not handle any exceptions/errors
 * for middleware added after it.
 */
$errorMiddleware = $app->addErrorMiddleware(true, true, true);


// Run the app
$app->run();

但请注意,不需要

new Response();
的实例化;事实上,它给我带来了一个错误,因为它需要通过
RequestHandler
来解决。

我还删除了错误中间件,因为在 Slim 文档中还有另一个潜在的问题,您可能会错过。

希望这可以避免其他人因我而头痛。

© www.soinside.com 2019 - 2024. All rights reserved.