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

时间:2016-05-18 07:46:14

标签: php slim slim-3 respect-validation

我正在尝试将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的代码,我已将它们包含在这里

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

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

8 个答案:

答案 0 :(得分:12)

我已经解决了这个问题:

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

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

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

更新

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

答案 1 :(得分:6)

addContentLengthHeader设置为false不是一个正确的修复方法,可能会在您的应用变大时导致问题。您的问题是在返回响应之前打印的var_dump('middleware');。这会使Content-Length标头的大小不正确,从而导致错误,因为此外有字符。如果您有错误报告,php还应该通过让您了解有关意外数据的内容来暗示这一点。

要使用语句测试或修改您的中间件,请使用$response->getBody()->write('message');编辑响应正文,简单die('message');应该足以查看它是否已被点击。

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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

$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']);

答案 4 :(得分:0)

它实际上是一个与缓冲有关的缓冲区问题要么通过进入&#34; php.ini &#34;来关闭缓冲区。文件或只是在脚本开头使用 ob_end_clean() ...

答案 5 :(得分:0)

就我而言,我有一个双重$app->run();代码。

答案 6 :(得分:0)

如果对于某人来说,上述所有解决方案均无效,则您需要检查所包含的任何文件是否未编码为UTF8-Bom(或任何格式的Bom),{{ 3}}有助于解决问题,如果选择正确的格式,也可以通过vscode完成

答案 7 :(得分:0)

仅在索引中编辑下一个:

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