Необоснованные ошибки в 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, я включил их здесь


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

5

Решение

Я исправил свою проблему, выполнив это:

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

Я добавил атрибут addContentLengthHeader со значением false в массиве настроек.

Но я так и не понял, для чего это нужно

ОБНОВИТЬ

Эта проблема возникает из-за строки var_dump (middleware), которая изменяет длину содержимого ответа. Мое решение было просто взломать.
Спасибо @iKlsR за правильный ответ.

12

Другие решения

настройка addContentLengthHeader ложное не является правильным решением и может привести к неприятностям позже, когда ваше приложение станет больше. Ваша проблема заключается в var_dump('middleware'); который вы печатаете, прежде чем вернуть ответ. Это делает размер вашего Content-Length заголовок неверный, поэтому ошибка, так как есть символы вне этого. php также должен намекнуть на это, сообщив вам о непредвиденных данных, если у вас есть сообщения об ошибках.

Чтобы проверить или изменить ваше промежуточное ПО с помощью операторов, отредактируйте тело ответа с помощью $response->getBody()->write('message'); простой die('message'); должно быть достаточно хорошо, чтобы увидеть, если он попал.

6

У меня была такая же проблема, потому что я позвонил $app->run(); Заявление дважды. Я просто удалил один из них, и все работало хорошо (сохраняя: addContentLengthHeader как true).

1

У меня была такая же проблема с данным учебником, Фатальная ошибка производится этой линией:

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

На самом деле это проблема буфера, связанная с буферизацией, либо отключите буфер, перейдя в «php.ini«файл или просто использовать ob_end_clean () в начале вашего сценария …

0
По вопросам рекламы [email protected]