В PHP уже есть несколько встроенных функций, упрощающих работу с HTTP. Например, существуют суперглобальные переменные, содержащие информацию из запроса.
И они подойдут в случае, когда вы просто хотите запустить небольшой скрипт, который не составит труда поддерживать. Однако если вы хотите писать чистый, удобный в сопровождении SOLID-код, вместо них вам понадобится класс с красивым объектно-ориентированным интерфейсом, который вы сможете использовать в своем приложении.
Еще раз: вам не придется изобретать велосипед, а просто нужно установить пакет. Я решил написать свой собственный HTTP-компонент, потому что существующие мне не понравились, но вам не обязательно делать то же самое.
Вот альтернативы: Symfony HttpFoundation, Nette HTTP Component, Aura Web, sabre/http
В этом уроке я буду использовать свой собственный HTTP-компонент, но вы, естественно, можете использовать любой пакет, который вам нравится. Вам просто придется самостоятельно адаптировать код из туториала.
И снова отредактируйте composer.json , добавив новый компонент, а затем запустите composer update:
"require": { "php": ">=7.0.0", "filp/whoops": "~2.1", "patricklouys/http": "~1.4" },
Теперь добавьте в свой Bootstrap.php ниже кода обработчика ошибок следующий фрагмент (и не забудьте удалить исключение):
$request = new \Http\HttpRequest($_GET, $_POST, $_COOKIE, $_FILES, $_SERVER);
$response = new \Http\HttpResponse;
Это задаст объекты Request и Response, которые вы можете использовать в других классах для получения данных из запроса и отправки ответа обратно в браузер.
Чтобы действительно отправить что-то обратно, вам также необходимо добавить следующий фрагмент в конец файла Bootstrap.php:
foreach ($response->getHeaders() as $header) {
header($header, false);
}
echo $response->getContent();
Ответные данные будут отправлены в браузер. Если вы этого не сделаете, ничего не произойдет, поскольку объект Response только хранит данные. Большинство других HTTP-компонентов функционируют иначе: их классы отправляют данные обратно в браузер в качестве побочного эффекта. Имейте это в виду, если пользуетесь другим компонентом.
Второй параметр header() имеет значение false, поскольку в противном случае существующие заголовки будут перезаписаны.
Сейчас он просто отправляет пустой ответ обратно в браузер с кодом состояния 200. Чтобы это изменить, добавьте следующий код между приведенными выше фрагментами кода (прямо перед оператором foreach):
$content = '<h1>Hello World</h1>';
$response->setContent($content);
Если хотите потестить ошибку 404, используйте следующий код:
$response->setContent('404 - Page not found'); $response->setStatusCode(404);
Помните, что объект только хранит данные, поэтому, если вы установите несколько кодов состояния перед отправкой ответа, применится только последний. В последующих частях я покажу вам, как использовать различные функции компонентов. А пока не стесняйтесь читать документацию или исходный код, если хотите узнать, как все работает.