PHP Slim 3 中间件上的不合理错误
Unreasonable Errors on PHP Slim 3 Middleware
我正在尝试使用 ValidationErrorsMiddleware.php class 作为中间件,所以我将以下代码添加到我的 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
以防万一,任何人都需要查看我的 classes 和 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';
我已经解决了我的问题:
return [
'settings' => [
// Slim Settings
'determineRouteBeforeAppMiddleware' => true,
'displayErrorDetails' => true,
'addContentLengthHeader' => false,
我在设置数组中添加了值为 false 的属性 addContentLengthHeader。
但是我还是不明白这是干嘛的
更新
这个问题的发生是因为 var_dump(middleware) 行改变了响应的内容长度。我的解决方案只是一个黑客。
感谢@iKlsR 的正确答案。
将 addContentLengthHeader
设置为 false 不是正确的解决方法,并且可能会在您的应用变大时导致问题。您的问题是您在 return 响应之前打印的 var_dump('middleware');
。这使得 Content-Length
header 的大小不正确,因此是错误,因为在这个之外还有字符。 php 如果您有错误报告,也应该通过让您了解一些意外数据来提示这一点。
要使用语句测试或修改您的中间件,请使用 $response->getBody()->write('message');
编辑响应 body,但一个简单的 die('message');
应该足以查看它是否被命中。
我在给定的教程中遇到了同样的问题,致命错误 是由这一行产生的:
$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']);
我遇到了同样的问题,因为我调用了两次 $app->run();
语句。我刚刚删除了其中一个并且一切正常(保持:addContentLengthHeader
为 true
)。
它实际上是一个与缓冲有关的缓冲区问题,要么通过进入“php.ini”文件关闭缓冲区,要么简单地使用 ob_end_clean() 在脚本的开头...
在我的例子中,我有一个双 $app->run();
代码。
如果以上所有解决方案对某人都不起作用,您将需要检查您包含的任何文件是否未编码为 UTF8-Bom
(或任何格式的 Bom), this answer 此处有助于解决问题,如果您 select 格式正确
也可以通过 vscode 完成
只有您编辑了索引中的下一个:
$app = new \Slim\App([
'settings' => [
'addContentLengthHeader' => false
]
]);
我正在尝试使用 ValidationErrorsMiddleware.php class 作为中间件,所以我将以下代码添加到我的 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
以防万一,任何人都需要查看我的 classes 和 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';
我已经解决了我的问题:
return [
'settings' => [
// Slim Settings
'determineRouteBeforeAppMiddleware' => true,
'displayErrorDetails' => true,
'addContentLengthHeader' => false,
我在设置数组中添加了值为 false 的属性 addContentLengthHeader。
但是我还是不明白这是干嘛的
更新
这个问题的发生是因为 var_dump(middleware) 行改变了响应的内容长度。我的解决方案只是一个黑客。 感谢@iKlsR 的正确答案。
将 addContentLengthHeader
设置为 false 不是正确的解决方法,并且可能会在您的应用变大时导致问题。您的问题是您在 return 响应之前打印的 var_dump('middleware');
。这使得 Content-Length
header 的大小不正确,因此是错误,因为在这个之外还有字符。 php 如果您有错误报告,也应该通过让您了解一些意外数据来提示这一点。
要使用语句测试或修改您的中间件,请使用 $response->getBody()->write('message');
编辑响应 body,但一个简单的 die('message');
应该足以查看它是否被命中。
我在给定的教程中遇到了同样的问题,致命错误 是由这一行产生的:
$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']);
我遇到了同样的问题,因为我调用了两次 $app->run();
语句。我刚刚删除了其中一个并且一切正常(保持:addContentLengthHeader
为 true
)。
它实际上是一个与缓冲有关的缓冲区问题,要么通过进入“php.ini”文件关闭缓冲区,要么简单地使用 ob_end_clean() 在脚本的开头...
在我的例子中,我有一个双 $app->run();
代码。
如果以上所有解决方案对某人都不起作用,您将需要检查您包含的任何文件是否未编码为 UTF8-Bom
(或任何格式的 Bom), this answer 此处有助于解决问题,如果您 select 格式正确
只有您编辑了索引中的下一个:
$app = new \Slim\App([
'settings' => [
'addContentLengthHeader' => false
]
]);