PHP Slim 3中间件的不合理错误

Dar*_*rit 5 php slim respect-validation slim-3

我试图使用ValidationErrorsMiddleware.php类作为中间件,所以我将以下代码添加到我的bootstrap/app.php:

$app->add(new App\Middleware\ValidationErrorsMiddleware($container));
Run Code Online (Sandbox Code Playgroud)

将上面的代码添加到我的app.php后,我收到以下错误:

Fatal error: Uncaught exception 'RuntimeException' with message 'Unexpected data in output buffer. Maybe you have characters before an opening <?php tag?' in C:\wamp64\www\authentication\vendor\slim\slim\Slim\App.php on line 552
RuntimeException: Unexpected data in output buffer. Maybe you have characters before an opening <?php tag? in C:\wamp64\www\authentication\vendor\slim\slim\Slim\App.php on line 552
Run Code Online (Sandbox Code Playgroud)

为了以防万一,任何人都需要查看我的类和app.php的代码,我已将它们包括在这里


ValidationErrorsMiddleware.php

<?php

namespace App\Middleware;

class ValidationErrorsMiddleware extends Middleware {

  public function __invoke($request, $response, $next) {

    var_dump('middleware');
    $response = $next($request, $response);

    return $response;
  }
}
Run Code Online (Sandbox Code Playgroud)

Middleware.php

<?php

namespace App\Middleware;

class Middleware {

protected $container;

  public function __construct($container) {

    $this->container = $container;
  }
}
Run Code Online (Sandbox Code Playgroud)

App.php

<?php

session_start();

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

$app = new \Slim\App([
'settings' => [
    'determineRouteBeforeAppMiddleware' => false,
    'displayErrorDetails' => true,
    'db' => [
        // Eloquent configuration
        'driver' => 'mysql',
        'host' => 'localhost',
        'database' => 'phpdb',
        'username' => 'root',
        'password' => 'root',
        'charset' => 'utf8',
        'collation' => 'utf8_unicode_ci',
        'prefix' => '',
    ]
],
]);


$container = $app->getContainer();

$app->add(new App\Middleware\ValidationErrorsMiddleware($container));

require __DIR__ . '/../app/routes.php';
Run Code Online (Sandbox Code Playgroud)

Mar*_*oso 12

我已经解决了这个问题:

return [
'settings' => [
    // Slim Settings
    'determineRouteBeforeAppMiddleware' => true,
    'displayErrorDetails' => true,
    'addContentLengthHeader' => false,
Run Code Online (Sandbox Code Playgroud)

我在settings数组中添加了值为false的addContentLengthHeader属性.

但我仍然不明白这是为了什么

UPDATE

出现此问题是因为行var_dump(中间件)会更改响应的内容长度.我的解决方案只是一个黑客.感谢@iKlsR的正确答案.

  • 真棒!它真的有效:))我一直在努力解决这个问题,现在我可以继续处理身份验证的事情了.谢谢. (2认同)

iKl*_*lsR 6

设置addContentLengthHeader为false不是一个正确的修复,并可能导致您的应用程序变大后的困境.您的问题是var_dump('middleware');在您返回响应之前打印的问题.这使得Content-Length标题的大小不正确,从而导致错误,因为除此之外还有字符.如果您有错误报告,php也应该通过让您了解有关意外数据的信息来暗示这一点.

要使用语句测试或修改中间件,请$response->getBody()->write('message');使用简单的方法编辑响应主体,die('message');以确定它是否已被命中.

  • 此问题中的代码遵循https://www.youtube.com/watch?v=0hKciR_dJAk&index=12&list=PLfdtiltiRHWGc_yY90XRdq6mRww042aEC.你能解释为什么在这个视频中,他们没有得到标题的错误,但我和OP得到了 (2认同)