【Laravel】Intervention Image v3で画像をresponseする

こんにちは、フリーランスエンジニアの太田雅昭です。

Intervention Image v3

Intervention Image v3は割と最近v2からアップデートされた関係で、情報が少ないです。そのためChatGPTでは解決しにくい問題も多々あります。

responseで返す

公式サイトでは、以下のコードが紹介されています。

use Intervention\Image\Laravel\Facades\Image;

Route::get('/', function () {
    $image = Image::read('images/example.jpg');
});

これを見ると、特にreturnされたものはありません。そうかPHPはreturnしなくても最後の値を返す仕様だったかな?などという妄想を招くような記述は控えていただきたいです。おそらく単に、呼び出し部分だけ参考として提示されているものと思われます。

試しに$imageをreturnすると以下のエラーとなります。middlewareで発生しました。

Symfony\Component\HttpFoundation\Response::setContent(): Argument #1 ($content) must be of type ?string, Intervention\Image\Image given

つまり、Imageオブジェクトをそのまま返してもresponseにならないということが分かりました。

以下のようにする必要があります。

return Response::make($image->toWebp(), 200, [
    'Content-Type' => 'image/webp',
]);

都度コンバートを呼び出して返す必要があるようです。本当にそれしかないのか、色々探してみましたが結局分からずじまいです。せっかくLaravelと統合されているのだから、resopnse用の関数も欲しいところですね。