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


Unreasonable Errors on PHP Slim 3 Middleware

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

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

在将上述代码添加到我的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

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


验证错误Middleware.php

<?php
namespace App'Middleware;
class ValidationErrorsMiddleware extends Middleware {
  public function __invoke($request, $response, $next) {
    var_dump('middleware');
    $response = $next($request, $response);
    return $response;
  }
}

中间件.php

<?php
namespace App'Middleware;
class Middleware {
protected $container;
  public function __construct($container) {
    $this->container = $container;
  }
}

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';

我已经解决了这样做的问题:

return [
'settings' => [
    // Slim Settings
    'determineRouteBeforeAppMiddleware' => true,
    'displayErrorDetails' => true,
    'addContentLengthHeader' => false,

我在设置数组中添加了值为false的属性addContentLengthHeader。

但我仍然不明白这对来说是什么

更新

出现此问题的原因是行var_dump(中间件)更改了响应的内容长度。我的解决方案只是一个破解。感谢@iKlsR的正确回答。

addContentLengthHeader设置为false不是一个合适的解决方案,并且可能在稍后应用程序变得更大时导致问题。您的问题是在返回响应之前打印的var_dump('middleware');。这会使Content-Length标头的大小不正确,从而导致错误,因为有超出此大小的字符。php还应该提示这一点,让您知道一些关于意外数据的信息,如果您在.上有错误报告的话

要使用语句测试或修改中间件,请使用$response->getBody()->write('message');编辑响应主体,因为一个简单的die('message');应该足够好,可以查看它是否被击中。

我遇到了同样的问题,因为我调用了$app->run();语句两次。我刚刚删除了其中一个,一切都很好(保留:addContentLengthHeadertrue)。

我在给定的教程中遇到了同样的问题,致命错误由以下行产生:

$this->container->view->getEnvironment()->addGlobal('errors', $_SESSION['errors']);
unset($_SESSION['errors']);

引导时的$_SESSION['errors']没有设置,在这种情况下,我们收到一个导致致命错误的通知

我做了什么,我在启动时检查$_SESSION['errors']是否设置为

if(isset($_SESSION['errors'])) {
        $this->container->view->getEnvironment()->addGlobal('errors', $_SESSION['errors']);
    }
    unset($_SESSION['errors']);

这实际上是一个与缓冲有关的缓冲区问题,可以通过进入"php.ini"文件来关闭缓冲区,也可以在脚本开头简单地使用ob_end_clean()。。。

在我的例子中,我有一个双$app->run();代码。

如果对某人来说,上述所有解决方案都不起作用,您将需要检查您包含的任何文件是否未编码为UTF8-Bom(或任何格式的Bom),这里的答案有助于解决问题,如果您选择正确的格式,也可以通过vscode来完成

只有您编辑了索引中的下一个:

$app = new 'Slim'App([
    'settings' => [
        'addContentLengthHeader' => false
    ]
]);