【Laravel】ルートモデル結合で404が出る原因

こんにちは。今回はルートモデル結合で404が出る原因を解説します。

ルートモデル結合とは

まずはルートモデル結合機能について簡単に解説します。ルートモデル結合とは、URLに特定のモデルのIDを指定すると、指定したIDのモデルのインスタンスをダイレクトに取得できる機能です。モデル取得の処理をアプリケーション側で記述しなくても良いので非常に便利です。

サンプルコードで動作の説明をします。

// Userのモデルを取得しメールアドレスを返す
Route::get('/users/{user}', function(User $user) {
	return $user->email; 
});

// 実行例)http://hostname/users/1でid=1のUserインスタンスを取得する

このURLはhttp://hostname/users/1とアクセスするとid=1のUserインスタンスを取得することが出来ます。どのような仕組みになっているかを解説します。

まずは/user/{user}というURLでルートを作成します。{user}の部分には取得したいUserモデルのIDを指定してアクセスすることになります。次にクエストを処理するクロージャ側の引数にUserモデル型の$userを指定します。ここで重要なのがURL側の引数名とクロージャ側の引数名を一致させておくことです。今回の場合はuserという名前で定義しています。こうすることでクロージャ側の引数にUserモデルのインスタンスが入ってきます。

このようにルートモデル結合を利用するとモデルを簡単に取得することができるので、RESTFullなAPIをスピーディーに作ることが出来ます。非常に便利な機能ですよね。

404エラーが出る条件

データベースに存在しないモデルを取得しようとすると404エラー返されます。例えばid=10のモデルがデータベースに存在しない場合に/user/10にアクセスすると404となります。

落とし穴 ソフトデリート済のデータも404が返される

ソフトデリート済みのデータも404となります。ここは判っていないと結構ハマる箇所かと思います。ソフトデリート済みのデータを取得する際はおとなしくEloquentをwithTrashedで取得しましょう。

まとめ

モデルルート結合で404が返される原因を解説しました。モデルルート結合では404が返るということを理解し、結果をユーザーにどのように見せるか予め考えておくと良いと思います。

Laravel

Posted by kobainmac