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
で,wasRecentlyCreated
がtrue
だったら201 Created
で返すって感じです. 詳しくはコードを.