久々にQiita投稿します。
#前提
- Laravel Valetで開発環境を構築しています(Docker不使用)
- Laravel 8.41.0
- PHP 8.0.5
- Nginx 1.19.10
- macOS Big Sur 11.4
- リクエストしたらテキストをレスポンスボディとして返すAPIを作っています
「どうして」となったコード
HogeController.php
<?php
namespace App\Http\Controllers\Api;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
class HogeController extends Controller
{
public function fuga(Request $request): string
{
return response('OK')->header('Content-Type', 'text/plain');
}
}
と書いたらレスポンスが下記のようになりました。
% curl https://example.test/api/hoge/fuga
HTTP/1.1 200 OK
OK
どうしてHTTPヘッダーもレスポンスに混じっているんですかねぇ🤔
これが正解
HogeController.php
<?php
namespace App\Http\Controllers\Api;
use Illuminate\Http\Response;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
class HogeController extends Controller
{
public function fuga(Request $request): Response
{
return response('OK')->header('Content-Type', 'text/plain');
}
}
Illuminate\Http\Response
を戻り値の型宣言にしたら
% curl https://example.test/api/hoge/fuga
OK
期待通りstringだけのレスポンスが返ってきました👍
結局
「stringを返すからstringで型宣言だな!」という短絡的な思い込みは良くないですね。
最後に
マサカリ大歓迎です。
よろしければ、LGTMボタンを押して行ってくださいね🌟
見出しの出典