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

【Laravel】Routingとは?getメソッドを使ったルーティング方法の実例まとめ。

Routingを理解する。getメソッドを使った主要なルーティング方法の実例まとめ。

参考:Larave公式 routing

目次

  1. Routingとは?
  2. Routingファイルの場所
  3. Routerの主なメソッド一覧
  4. Route::getメソッド
    1. 文字列を指定
    2. viewを指定
    3. コントローラーとメソッドを指定
    4. パラメータを渡す
    5. パラメータを複数渡す
    6. パラメータの有無で条件分岐させる
    7. コントローラーにパラメータを渡す
    8. whereメソッドでパラメータを指定する
    9. パラメータをグローバルに指定する
  5. 名前付きルート
    1. nameメソッド
    2. asでルート名を指定する
  6. middlewareメソッドでフィルターをかける
  7. groupメソッドで複数のルートをまとめる
  8. redirectメソッドで転送する
  9. ルートとルート名の一覧を表示する


Routingとは?

入力されたURLに対し、表示するファイル(またはテキストなど)を指定する処理。


Routingファイルの場所

routes/web.phpに記述する。

image.png

routingの例
use Illuminate\Support\Facades\Route;

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

上記処理では、/greetingにアクセスすると、Hello Worldを表示する。

use Illuminate\Support\Facades\Route;
Routeファサードを使う宣言をする。
ファサードとはクラスのインスタンス的なもの。その中のメソッドを簡単に呼び出せるようになる。

・statelessやRESTfull APIの場合
セッション情報を保持しないstatelessなどのルーティングはapi.phpに記述する。



ルートファイルはApp\Providers\RouteServiceProviderによって自動的に読み込まれる。

image.png


Routerの主なメソッド一覧

メソッドではHTTP verbを指定する。

▼基本的な構文
Route::メソッド("$URI", 関数)

メソッド 内容 実例
get URIのデータ取得 Route::get("/", $callback);
post URIのリソースを作成 Route::post("/", $callback);
prefix URIを共通化 Route::prefix('main')->group(function () { });
name ルート名を共通化 Route::name('main.')->group(function () { });
group URI、ルート名を共通化 Route::view('/welcome', 'welcome');
view ビューファイルを指定 Route::view('/welcome', 'welcome');
put URIのリソースを新規作成または置換(更新) Route::put("/", $callback);
patch リソースの部分置換 (更新) Route::patch("/", $callback);
delete URIの内容を削除 Route::delete("/", $callback);
options URIに対して利用できるメソッドの一覧を取得 Route::option("/", $callback);
match 複数のHTTP verbを指定 Route::match(['get', 'post'], '/', function () { });
any すべてのHTTP verbに応答 Route::any('/', function () { });
redirect 指定したURIにリダイレクト Route::redirect('/here', '/there');

よく使うのはgetgroupprefixあたり。残りは使う頻度が低い。

Route::viewはよりシンプルなviewヘルパーで代替できる。

>HTTP verb (HTTP動詞)
get, post, put, patch, delete, optionsが該当。


Route::getメソッド

書き方が複数存在する。

1. 文字列を指定

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

/xxxにアクセスしたら「Hello World」を返す。


2. viewを指定

Route::get('xxx', function () {
    return view('hello');
});

/xxxにアクセスしたら、hello.balde.phpを表示する。

データも渡す場合

Route::get('xxx', function () {
    return view('hello', ['age'=>'25']);
});

25を格納したageという変数を渡す。hello.balde.phpの中で$ageで呼び出せる。

変数を格納することも可能。
view('hello', ['age'=>'$var']


3. コントローラーとメソッドを指定

Route::get('xxx', 'HelloController@message')

/xxxにアクセスしたら、HelloControllerのmessageメソッドを実行する。



▼コントローラーの例

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;

class HelloController extends Controller
{
    public function message(){
        $msg = 'こんにちは';
        $title = 'this is title!';

        return view('child', ['hello'=>$msg, 'title'=>$title]);
    }
}

>コントローラーでページを表示する方法はこちら


4. パラメータを渡す

ルーティングのURIで{パラメータ名}と記述すると、該当するパスがパラメータとして変数に格納される。

functionの引数に渡せば、そのパラメータを利用できる。

Route::get('/パス/{パラメータ名}, function($パラメータ名){処理}'


Route::get('user/{id}', function($id){
    return 'ユーザー'.$id;
});



▼ブラウザの表示

image.png


5. パラメータを複数渡す

パラメータは複数渡すことも可能。

Route::get('user/{name}/{id}', function($username, $number){
    return 'こんにちは。ユーザーID:'.$number.'の'.$username.'さん';
});



▼ブラウザの表示

image.png


6. パラメータの有無で条件分岐させる

パラメータ名に?をつけると、パラメータ名がない場合に変数に代入する値を指定できる。

Route::get('/user/{name?}', function ($name = 'John') {
    return $name;
});

/user/にアクセスすると、指定したJhonを返す。
/user/$名前/にアクセスすると、入力された名前を返す。

image.png
image.png


7. コントローラーにパラメータを渡す

第1引数にパラメータのあるURIを指定し、第2引数にコントローラーのメソッドを指定した場合、パラメータがコントローラーのメソッドの引数に渡される。


web.php
Route::get('user/{name}/{id}', 'HelloController@message');



▼コントローラーの例

HelloController.php
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;

class HelloController extends Controller
{
    public function message($name, $id){
        return 'こんにちは、ID:'.$id.'の'.$name.'さん';
    }
}



▼ブラウザの表示

image.png


8. whereメソッドでパラメータを指定する

whereメソッドを使うことでパラメータのフォーマットを指定できる。

where('パラメータ名', '正規表現')

Route::get('/user/{name?}', function ($name = 'John') {
    return $name;
})->where('name', '[A-z]+');

※注意点
・whereメソッドで指定するパラメータ名は、getのURIで指定しているパラメータ名と合わせる。functionの引数の変数名ではない。



▼指定したフォーマットに合わなかった場合
該当するページがないと判断され404 | Not Foundとなる。

image.png


パラメータを2つ以上指定する場合

配列にして、ダブルアローで指定する。

where(['パラメータ名'=>'正規表現', 'パラメータ名'=>'正規表現')

->where(['name'=>'[ぁ-ん]+', 'id'=>'[1-9]+'])
実例
Route::get('user/{name}/{id}', function($username, $number){
    return 'こんにちは。ユーザーID:'.$number.'の'.$username.'さん';
})->where(['name'=>'[ぁ-ん]+', 'id'=>'[1-9]+']);



もしくは、->where()をメソッドチェーンでつなげるのでもOK。

->where('name', '[ぁ-ん]+')->where('id', '[1-9]+');


その他の指定方法

整数やアルファベットなどよく使うフォーマットには専用のメソッドが用意されている。

メソッド 内容
whereNumber() 整数
whereAlpha() アルファベット
whereAlphaNumeric() アルファベットか数値
whereUuid() ユニークな整数

▼使用例

->whereNumber('id')->whereAlpha('name')

Route::get('/user/{id}/{name}', function ($id, $name) {
    //
})->whereNumber('id')->whereAlpha('name');


9. パラメータをグローバルに指定する

App\Providers\RouteServiceProviderクラスのbootメソッド内でpatternメソッドを使って指定すると、グローバルにパラメータのフォーマットを制限できる。

image.png

Route:pattern('パラメータ名', '正規表現')

RouteServiceProvider.php
public function boot()
{
    Route::pattern('id', '[0-9]+');
}

指定したパラメータを使用する際は、自動的に指定したフォーマットが適用される。


名前付きルート

各ルートに名前をつけることができる。

名前をつけると、routeメソッドを使って、そのURIを呼び出すことができる

▼名前付きルートのメリット

元のURIはルートファイル(web.php)で定義するので、URIを変更する場合に、ルートファイルのみ変更すればいい

名前付きルートではなくURIを指定していた場合、該当するすべてのURIを探し出し変更しなくてはならない。

このため、基本的にルートには名前をつける



▼ルートに名前をつける方法
2つある。

1. name('ルート名')
2. 'as' => 'ルート名' 


nameメソッド

name('ルート名')

Route::get('パス', function () { })->name('usertop');

▼実例

Route::get('user', function () {
    return "ユーザーページTOP";
})->name('usertop');

Route::get('user/{id}/profile', function ($id) {
    return redirect()->route('usertop');
});

image.png

コントローラーアクションにもルート名を付けられる。

Route::get('user/profile', 'UserProfileController@show')->name('profile');


パラメータの値を指定する

パラメータありのルートをパスにした場合に、routeメソッドで呼び出し時にパラメータを指定できる。

Route::get('/user/{id}/profile', function ($id) {
    //
})->name('profile');

$url = route('profile', ['id' => 1]);
// /user/1/profile


データを渡す

パラメータ名以外の変数を指定した場合は、getでそのデータを渡せる。

Route::get('/user/{id}/profile', function ($id) {
    //
})->name('profile');

$url = route('profile', ['id' => 1, 'photos' => 'yes']);
// /user/1/profile?photos=yes


asでルート名を指定する

getメソッドの第2引数を配列化し、'as' => 'ルート名'とすることでも指定できる。

Route::get('user', ['as' => 'usertop', function () {
    return "ユーザーページTOP";
}]);

ルーティングでasが使われていたら、ルート名前を指定しているということ。


コントローラーアクションを指定する場合

コントローラーの指定にusesを使う。

['uses' => 'コントローラー名@アクション名']

Route::get('xxx', ['as' => 'hello', 'uses' => 'StringController@hello']);


middlewareメソッドでフィルターをかける

middlewareメソッドを使うと、HTTP Requestをコントローラーに渡す前や、Responseをクライアントに返す前に、設定した条件のフィルターを介すことができる。

middlewareメソッドとは?


groupメソッドで複数のルートをまとめる

groupメソッドを使うと、共通のURI接頭語やルート名接頭語を省略表記できる。

また、middlewareメソッドにgroupメソッドをチェーンでつなぐこともできる。

groupメソッドとは?


redirectメソッドで転送する

301や302転送を指定して転送することができる。

redirectメソッドとは?


ルートとルート名の一覧を表示する

php artisan route:list

$ php artisan route:list
+--------+----------+-------------------+---------------+----------------------------------------------+------------+
| Domain | Method   | URI               | Name          | Action                                       | Middleware |
+--------+----------+-------------------+---------------+----------------------------------------------+------------+
|        | GET|HEAD | /                 |               | Closure                                      | web        |
|        | GET|HEAD | api/user          |               | Closure                                      | api        |
|        |          |                   |               |                                              | auth:api   |
|        | GET|HEAD | blade             |               | Closure                                      | web        |
|        | GET|HEAD | msg               |               | App\Http\Controllers\HelloController@title   | web        |
|        | GET|HEAD | topics            | topics.index  | App\Http\Controllers\TopicsController@index  | web        |
|        | GET|HEAD | topics/detail     | topics.detail | App\Http\Controllers\TopicsController@detail | web        |
|        | GET|HEAD | topics/show       | topics.show   | App\Http\Controllers\TopicsController@show   | web        |
|        | GET|HEAD | user              | usertop       | Closure                                      | web        |
|        | GET|HEAD | user/{id}/profile |               | Closure                                      | web        |
|        | GET|HEAD | xxx               | hello         | App\Http\Controllers\StringController@hello  | web        |
+--------+----------+-------------------+---------------+----------------------------------------------+------------+

各URI毎の、ルート名、アクション(関数かコントローラーか)、適用されているミドルウェアを確認することができる。

yuta-38
メモとして活用してます
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