Как использовать return вместо echo
Начал изучать php фреймворк laravel и обратил внимание, что для вывода текста достаточно писать:
return "Hello World!";
вместо аналогичного на php:
echo "Hello World!";
Как это работает? Сначала думал, что это делается каким-то хитрым способом через буфер, например:
ob_start();
function my() {
return "Hello World!";
}
my();
ob_get_contents();
Но такой вариант не работает. Как это работает?
Ответы (2 шт):
Как вы молодёжь любите себе жизнь усложнять :)
Открываем документацию : https://laravel.su/docs/8.x/responses
И что мы там видим :
Все маршруты и контроллеры должны возвращать ответ, который будет отправлен обратно в браузер пользователя. Laravel предлагает несколько разных способов вернуть ответы. Самый простой ответ – это возврат строки из маршрута или контроллера. Фреймворк автоматически преобразует строку в полный HTTP-ответ:
Route::get('/', function () {
return 'Hello World';
});
(!!!) Все маршруты и контроллеры должны возвращать ответ, который будет отправлен обратно в браузер пользователя. (!!!)
Никаких вам echo! Забудьте! Вы ломаете все механизмы Response, Хуков и Middleware!!!
Если вы хотите выводить HTML то используйте Blade https://laravel.su/docs/8.x/blade
Если лезь глубоко под капот, то по факту твоя строка преобразуется в
Illuminate\Support\Stringable
А от туда уже создаёться объект Illuminate\Http\Response
$response = new Response($response->__toString(), 200, ['Content-Type' => 'text/html']);
Всё это описано в классе:
Illuminate\Routing\Router в методе toResponse
Возможно, кому-то это будет полезно. Для реализации необходимо записывать данные в поток OutputStream. Здесь можно ознакомиться с потоками ввода / вывода (https://www.php.net/manual/ru/wrappers.php.php).
Теперь к самой реализации.
/**
* Здесь может быть функция или метод класса
*/
function test() {
return "Hello World!";
}
/**
* Открываем поток OutputStream для записи данных
*/
$outputStream = fopen('php://output', 'a');
/**
* Отправляем http код ответа (в данном случае это будет статус 200 - ОК)
*/
http_response_code(200);
/**
* Устанавливаем заголовок, чтобы данные отображались в html
*/
header('Content-Type: text/html');
/**
* Записываем данные в поток вывода (OutputStream)
* в нашем случае передаем вторым аргументом нашу функцию
*/
fwrite($outputStream, test());
/**
* Закрываем поток для записи
*/
fclose($outputStream);
Получаем результат на странице
Hello World!