Help us understand the problem. What is going on with this article?

Laravelのルーティング書き方まとめ

More than 3 years have passed since last update.
※ Route::controller のルーティングはLaravel 5.2 で非推奨、Laravel5.3 で削除されました

これはLaravel Advent Calendar 17日目の記事です。
昨日はHiroKwsさんの最強のデバッグツールlaravel-debuggerについてでした。

今回はLaravelのルーティングの書き方をまとめてみようと思います。

まず基本ですがLaravelではルーティングの設定はapp/routes.phpにまとめて記載するようになっていますので今回ご紹介するルーティングのコードは全てapp/routes.phpに記載するものと思ってください。

Laravelのルーティングは大きく分けて3つの書き方がありますので順番に見ていきましょう。

1, ルーティングと同時に表示内容もクロージャで記載してしまう方法

これは一番シンプルなルーティングの書き方かもしれません。
コードと一緒に見ていきます。

Route::get('hello/', function()
{
    return 'Hello World';
});

http://example.com/hello にアクセスされたら「Hello World」と表示させるというルーティングです。

Route::get('hello/{message}', function($message)
{
    return 'Hello World' . $message;
});

↑ helloの次に指定されたパスをパラメータとして受け取り、受け取ったパラメータをクロージャに引数として渡し表示内容を変化させるといったルーティングです。

Route::get('hello/{message}', function($message)
{
    return 'Hello World' . $message;
})
->where('message', '[A-Za-z]+');

↑ 受け取るパラメータの値をwhereメソッドで指定し、指定した値のものであった場合に適用するといったルーティングです。
whereでの指定の仕方は1番目の引数にパラメータ名を指定し、2番目にパラメータ内容を指定します。
パラメータ内容指定には正規表現が使用可能です。

getの部分はpostやput等のhttpメソッドに対応していますので適宜応用が可能です。

2, コントローラーとメソッドを指定しルーティングさせる方法

フレームワークでおなじみのルーティングです。
なんの変哲もないと思います。

Route::get('hello/', 'App\Controllers\helloController@goodmorning');

↑ hello/にアクセスされたらhelloControllerコントローラーのgoodmorningメソッドを呼び出せというルーティングです。

Route::get('hello/{message}', 'App\Controllers\helloController@goodmorning');

↑ helloの次に指定されたパスをパラメータとして受け取り、受け取ったパラメータをメソッドの引数として渡すというルーティングです。
コントローラーは下記のように書けばいいと思います。

namespace App\Controllers;
class helloContorller extends BaseController
{
    public function goodmorning($message)
    {
        
    }
}

おなじみですね。

3, RESTfulにルーティングさせる方法

このルーティングはすてきです。
僕が最初にLaravelでおおっ!と思ったところはこのルーティングでした。
まずはルーティングのコード。

Route::controller('hello/', 'App\Controllers\helloController');

↑ このワンライナーのコードを書くだけで下記のような多数のルーティングに対応することができます。

namespace App\Controllers;
class helloController extends BaseController
{
    // getでhello/にアクセスされた場合
    public function getIndex()
    {
        
    }

    // getでhello/goodmorningにアクセスされた場合
    public function getGoodmorning()
    {
        
    }

    // postでhello/goodmorningにアクセスされた場合
    public function postGoodmorning()
    {
        
    }

    // getでhello/goodmorning/messageでアクセスされた場合
    public function getGoodmorning($message)
    {
        
    }
}

説明不要だと思いますがアクセスされたパスと同じ名前を持つアクションメソッドが実行されています。
各アクションメソッド名の前についているgetやpostはアクセス時のhttpメソッドです。
とても分かりやすくてすてきですね。

4, Resourcefulにルーティングさせる方法

これもすてきです。
でも今回調べるまで知りませんでした。orz
てかResourcefulとか言われてもピンとこないと思うのでまずはルーティングコードから見ていきましょう。

Route::resource('hello', 'App\Controllers\helloController');

これも3のRestfulルーティングと同様ワンライナーで多数のルーティングに対応させることができます。

namespace App\Controllers;
class helloController extends BaseController
{
    // getでhello/にアクセスされた場合
    public function index()
    {
        
    }

    // getでhello/createにアクセスされた場合
    public function create()
    {
        
    }

    // postでhello/にアクセスされた場合
    public function store()
    {
        
    }

    // getでhello/messageにアクセスされた場合
    public function show($message)
    {
        
    }

    // getでhello/message/editにアクセスされた場合
    public function edit($message)
    {
        
    }

    // putまたはpatchでhello/messageにアクセスされた場合
    public function update($message)
    {
        
    }

    // deleteでhello/messageにアクセスされた場合
    public function destroy($message)
    {
        
    }
}

ちょっとわかりにくいかと思いますので、Laravelの公式ドキュメントに図が掲載されていたのでこちらとあわせてご覧ください。

laravel-resourceful-routing-map

図をみるとわかりますが指定したresource(今回の例ではhello)に対してhttpメソッドやパスで直感的にアクセスできるようルーティングしてくれています。

最後に

LaravelのルーティングはRestfulルーティングやResourcefulルーティングのおかげで非常にわかりやすくそして綺麗に書けます。
ルーティングの書きやすさは間違いなくLaravelの目玉の一つだと言えると思います。

今回は基本的なルーティングについて説明させて頂きましたがLaravelは他にもルーティングをする前に認証をかけられたり、ルーティングに名前をつけられたりとまだまだ機能は豊富です。
Laravelが気になった方はそちらも確認してみてください。

さて明日のLaravel Advent Calendar はkam01さんで「laravelでmodule」についてです。
おたのしみに!

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした