【Laravel】Routing(ルーティング)とは何か?実例で解説|getメソッドを使ったルーティング方法一覧まとめ

laravel-prograshi(プロぐらし) Laravel
記事内に広告が含まれていることがあります。

Routing(ルーティング)とは何か?

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


Routingファイルの場所

routes/web.phpに記述する。


ルーティングの実例

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によって自動的に読み込まれる。


Routerの主なメソッド一覧

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

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

メソッド内容実例
getURIのデータ取得Route::get(“/”, $callback);
postURIのリソースを作成Route::post(“/”, $callback);
prefixURIを共通化Route::prefix(‘main’)->group(function () { });
nameルート名を共通化Route::name(‘main.’)->group(function () { });
groupURI、ルート名を共通化Route::view(‘/welcome’, ‘welcome’);
viewビューファイルを指定Route::view(‘/welcome’, ‘welcome’);
putURIのリソースを新規作成または置換(更新)Route::put(“/”, $callback);
patchリソースの部分置換 (更新)Route::patch(“/”, $callback);
deleteURIの内容を削除Route::delete(“/”, $callback);
optionsURIに対して利用できるメソッドの一覧を取得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メソッドで表示内容を指定する方法

Route::getメソッドで表示内容を指定するには書き方がいくつか存在する。

Route::getメソッドで表示内容を指定する方法
  1. 文字列を指定。
  2. viewを指定。
  3. コントローラーとメソッドを指定。
  4. パラメータを渡す。
  5. パラメータを複数渡す。
  6. パラメータの有無で条件分岐させる。
  7. コントローラーにパラメータを渡す。
  8. whereメソッドでパラメータを指定する。
  9. パラメータをグローバルに指定する。


文字列を指定

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

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


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']


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

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]);
    }
}

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


パラメータを渡す

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

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

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

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



▼ブラウザの表示


パラメータを複数渡す

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

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



▼ブラウザの表示


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

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

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

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



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

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

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



▼コントローラーの例

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

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



▼ブラウザの表示


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

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

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

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

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



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


パラメータを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');


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

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

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

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');
});

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

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

タイトルとURLをコピーしました