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", 関数)
メソッド | 内容 | 実例 |
---|---|---|
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’); |
よく使うのはget
、group
、prefix
あたり。残りは使う頻度が低い。
Route::view
はよりシンプルなviewヘルパーで代替できる。
>HTTP verb (HTTP動詞)
get, post, put, patch, delete, optionsが該当。
Route::getメソッドで表示内容を指定する方法
Route::getメソッドで表示内容を指定するには書き方がいくつか存在する。
文字列を指定
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をクライアントに返す前に、設定した条件のフィルターを介すことができる。
groupメソッドで複数のルートをまとめる
groupメソッドを使うと、共通のURI接頭語やルート名接頭語を省略表記できる。
また、middlewareメソッドにgroupメソッドをチェーンでつなぐこともできる。
redirectメソッドで転送する
301や302転送を指定して転送することができる。
ルートとルート名の一覧を表示する
・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毎の、ルート名、アクション(関数かコントローラーか)、適用されているミドルウェアを確認することができる。