Я пытаюсь использовать класс 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';
Я исправил свою проблему, выполнив это:
return [
'settings' => [
// Slim Settings
'determineRouteBeforeAppMiddleware' => true,
'displayErrorDetails' => true,
'addContentLengthHeader' => false,
Я добавил атрибут addContentLengthHeader со значением false в массиве настроек.
Но я так и не понял, для чего это нужно
ОБНОВИТЬ
Эта проблема возникает из-за строки var_dump (middleware), которая изменяет длину содержимого ответа. Мое решение было просто взломать.
Спасибо @iKlsR за правильный ответ.
настройка addContentLengthHeader
ложное не является правильным решением и может привести к неприятностям позже, когда ваше приложение станет больше. Ваша проблема заключается в var_dump('middleware');
который вы печатаете, прежде чем вернуть ответ. Это делает размер вашего Content-Length
заголовок неверный, поэтому ошибка, так как есть символы вне этого. php также должен намекнуть на это, сообщив вам о непредвиденных данных, если у вас есть сообщения об ошибках.
Чтобы проверить или изменить ваше промежуточное ПО с помощью операторов, отредактируйте тело ответа с помощью $response->getBody()->write('message');
простой die('message');
должно быть достаточно хорошо, чтобы увидеть, если он попал.
У меня была такая же проблема, потому что я позвонил $app->run();
Заявление дважды. Я просто удалил один из них, и все работало хорошо (сохраняя: addContentLengthHeader
как true
).
У меня была такая же проблема с данным учебником, Фатальная ошибка производится этой линией:
$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 () в начале вашего сценария …