tanikoのぶろぐ

Laravelが 201 Createdを返すってさ

Laravel 5.6での話です. 5.6から, 新たにモデルを作成した際に200 OKではなく, 201 Createdを返すようになったってだけの話です. (今更?)

どういうことか

LaravelをAPIとして利用していた時に, Eloquentモデルを返した際に, 200だったのが, 201に変更になりました.

// app/Http/Controllers/PostController.php
<?php

namespace App\Http\Controllers;

use App\Post;
use App\Http\Requests\Post\CreateRequest;

class PostController extends Controller
{
    public function create(CreateRequest $request)
    {
        return $request
            ->user()
            ->posts()
            ->save(Post::make($request->only(['text'])));
    }
}

こんな感じのコードがあった場合, 5.5までだと200 OKで新規に作成されたPostのデータがレスポンスとして, 返ってきていました. しかし, 5.6からは201 CreatedとPostのデータが返ってくるようになりました.
特に副作用がなさそうですが, テストやライブラリで200かを使っていれば思わぬ動作をしてしまいます. 皆さんは, axiosとかでasync/awaitとかthen/catchとか使っているので大丈夫ですよね. 私はPHPUnitでassertStatus(200)とかしていたのでテストが転けた.

地味な変更点ではあるかと思いますが, せっかく201 Createdという, ちゃんと意味があるものがあるので, 嬉しいですね.

ちなみに

この話自体はLaravel 5.5の時に出ていて, PRも出されていましたが, バグフィックスとかではなく, 破壊的変更であったため, 見送られ, 5.6でPRがマージされました. 仕組み自体はRouterでレスポンス(コントローラでreturnしたもの)がIlluminate\Database\Eloquent\Modelで,wasRecentlyCreatedtrueだったら201 Createdで返すって感じです. 詳しくはコードを.