【Laravel 】ルーティングで全て完結?超速でAPI開発 ルートモデル結合

2021年7月18日

 

皆さんこんにちは。今回は、ルーティングに備わっている便利機能を解説します。その名も「ルートモデル結合」。これを使うと、ルーティングの中で簡単にEloquentモデルを取得することができます。この機能をうまく使うとシンプルなAPIであれば爆速で開発することができます。それではみていきましょう。

ルートモデル結合とは

一言でいうと、api.phpやweb.phpなどのルーティングでEloquentモデルを取得する仕組みです。百聞は一見にしかずなので、どれだけ簡単なのかまずはコードを御覧ください。

use App\Models\User;

Route::get('/users/{user}', function(User $user) {
	return $user->email;
});

/users/{user}というルートを定義しています。このURLにアクセスするとUserモデルのemail項目を取得することができます。どのような仕組みなのかを解説していきます。

まず、第一引数の中に定義されている{user}というパラメータです。実際にURLを呼び出す際にはこの部分に取得したいユーザーのidを指定します。id=1のユーザーを取得したい場合は/users/1とアクセスします。

次に第二引数です。この引数はクロージャ(無名関数)の形式で指定します。引数にはUserモデル型の変数$userを指定します。この$userは第一引数のURLに含まれていた{user}と名前を一致させる必要があります。この引数$userにはURLの{user}で指定したIDのモデルが渡ってきます。/users/1と指定した場合はid=1のuserが取得できるということですね。この引数$userを利用してクロージャの中で様々なロジックを書くことができます。今回はシンプルにemail項目を返しています。

ではここで定義したURLを実際に呼び出してみましょう。

# artisan serveでサイトを立ち上げておきます
http://localhost:8000/api/users/1

#以下のようなレスポンスが帰ってくる
joe@xxx.xxx

以上、理解いただけましたでしょうか。非常に簡単な記述でリソースを取得するAPIが構築できました。コントローラを作成せずに作ることができるので大分お気軽です!

使いどころ

ルートモデル結合は非常に便利ですが、デメリットもあります。ここで私なりに考えたルートモデル結合の使い方を紹介していきます。

単純な取得処理

ルートモデル結合は便利です!しかし複雑な処理には向きません。複雑なロジックも記述すること自体はできるのですが、全てをルーティングに記述するので、すぐにファイルが肥大化して読みづらくなります。ルーティングは他のURL定義も含まれているので、一覧性が命です。一つのURLで何十行も記述するのはやめましょう。

私が推奨するのは、ルートモデル結合を使うときは、ロジックを一切書かないというルールを作ることです。そうすれば1つのURLで3行ほどに収まるので一覧性は損ないません。また、ロジックがルーティングにあったり、コントローラにあったりとバラけたりしなくなるため管理しやすくなります。少し極端に思えるかもしれませんが、これぐらいがちょうどよいと私は思っています。

まとめ

いかがでしょうか。このような便利な機能は積極的に使っていきたいところですが、どのように使うのかを考えることが重要ですね。使い方を考えずに導入すると、カオスな状態を招いてしまうかもしれません。しっかりとした運用ルールを作った上で導入してみると良い結果につながると思います。

Laravel

Posted by kobainmac