4. Routing
Routingとは
Routing(ルーティング)の基本に関しては、「Webの基礎:MVC とルーティング」を参照してください。
ルーティングファイル
Laravelのルーティングファイルは、「routes/」フォルダ内のファイルで管理・設定します。
ルーティングファイル
ファイル | 説明 |
---|---|
api.php | APIのアクセスを管理 |
channels.php | ブロードキャストチャンネルのアクセス管理 |
console.php | コンソールプログラムの管理 |
web.php | 一般的なWebページのアクセス管理 |
ルーティングのファイル確認
Webルーティング
Web用のルーティングファイルは「routes/web.php」です。
ルーティングの内容
ルーティングプログラムの記述方法は、Laravelのバージョン、フロントエンド開発の選択により異なります。 今回はLaravel9の標準的な「web.php」で、トップページのルーティングが設定されています。
web.php
<?php
use Illuminate\Support\Facades\Route;
Route::get('/', function () {
return view('welcome');
});
ルーティングの確認
artisaonコマンドで、ルーティングのリストが確認できます。
php artisan route:list
ルーティングの基本
Routeクラス
ルーティングは、Routeクラスを元に「HTTPメソッド」「URLパターン」「処理」をセットで記述します。
Route::HTTPメソッド(URLパターン, 処理);
無名関数
処理を無名関数で記述する場合です。
Route::HTTPメソッド(URLパターン, function() {
return 処理;
});
Controller + Action
処理を「Controller + Action」で記述する場合です。
Route::HTTPメソッド(URLパターン, [Controller::class, Action]);
HTTPメソッド
「HTTPメソッド」は、主に「GET」「POST」を利用しますが、意図的に「PUT」や「DELETE」などを利用可能です。
HTTPメソッド | ルーティング | |
---|---|---|
GET | Route::get() | 通常リンク、読み込み、検索など |
POST | Route::post() | データ作成・更新・削除など |
PUT | Route:: put() | データ更新 |
DELETE | Route:: delete() | データ削除 |
PATCH | Route:: patch() | 部分更新 |
OPTIONS | Route:: options() | その他 |
Facade(ファサード)
Facadeとは?
「Route」クラスはFacade(ファサード)というデザインパターンで動作します。Facadeは、簡単にいうとクラスメソッドやメンバーを静的アクセスできるようにした仕組みです。
LaravelのFacade
Laravelでよく利用する機能をFacadeパターンでコーディングすることが多々あります。プログラムが肥大化したときに役割を分担することで、開発スピードを上げたり、管理しやすい設計になります。
ルーティング処理
ルーティングの作成
ルーティングを定義して、ブラウザに文字を表示してみましょう。
ルーティングの概要
URI | HTTPメソッド | 表示文字 |
---|---|---|
/about | GET | this is about page |
ルーティングがない場合
http://localhost:8000/about にアクセスすると、ルーティングされていないので「Not Found」ページが表示されます。
ルーティングの定義
「routes/web.php」を開きルーティング「/about」を定義します。表示文字は「return」で返します。
Route::get('/about', function() {
return 'this is about page';
});
「VSCode」のSnippet
「VSCode」では「routeget」のようなSnippetで、「Route::get()」をコードアシスタントできます。
ブラウザで確認
ルーティングを定義したら、ブラウザにアクセスして文字が表示されるか確認しましょう。
パラメータ取得
URLパラメータ
LaravelのRoutingではURLパラメータを取得でき、パラメータは {パラメータ名} で設定します。
GETのパラメータ
Route::get('/about/{パラメータ名}', 処理);
POSTのパラメータ
Route::post('/about/{パラメータ名}', 処理);
ルーティング定義
パラメータ定義
GETリクエストで「item/」にパラメータを取得するルーティングです。パラメータ名が「id」の場合 {id} で記述します。
Route::get('/item/{id}', 処理);
無名関数で取得
リクエストされたパラメータは、無名関数の引数で取得できます。ルーティングの {id} の部分がURLの任意な値に対応します。
Route::get('/item/{id}', function ($id) {
$message = "Item id is {$id}";
return $message;
});
ブラウザで確認
URLの「item/」以降の値を変えて表示文字を確認してみましょう。
namespace
namespace(ネームスペース)とは
PHPでは同じファイルやクラスが存在しても衝突しないように動作させるnamespaceという仕組みがあります。
Laravel の namespace
Laravelでは非常にたくさんのクラスファイルで構成されているため、namespaceでクラスファイルを利用するのが一般的です。
namespace修飾子
namespaceの定義は、namespace修飾子を記述します。
namespace ネームスペースのパス;
namespaceはファイルパスではない
namespaceの自分のファイルのパスにあわせて設定しますが、実際のフォルダパスではないことに注意しましょう。またフォルダは「 \ 」(バックスラッシュ)で区切ります。
namespace「Facades」
Laravelでよく利用される「Facades」の namespace です。
namespace Illuminate\Support\Facades;
- 実際のファイルパス:vender/laravel/framework/src/Illuminate/Support/Facades
クラスファイルの利用
use修飾子
クラスファイルの namespace での利用は use修飾子でクラスファイルのパスを指定します。
use クラスファイルのパス;
「web.php」の「Route」クラスを利用する例です。
use Illuminate\Support\Facades\Route;
パスは通常は自分のファイルを配置したフォルダを基本に記述します。
- 実際のファイルパス:vender/laravel/framework/src/Illuminate/Support/Facades/Route.php
Requestクラス
Requestクラスとは
「Request」クラスはHTTPリクエストに関するクラスで、リクエスト情報や送信データを取得できます。
Requestクラスの利用方法
「web.php」でRequestオブジェクトを利用しますが、Laravelの「Request」クラスが複数あるので「Illuminate\Http\Request」を指定します。「Request」を入力して「Illuminate\Http\Request」を選択します。
これで、Requestオブジェクトが利用できます。
web.php
use Illuminate\Http\Request;
ルーティング
GETリクエスト「/item」でルーティングします。
web.php
Route::get('/item', function () {
});
Requestデータ
Closures(コールバック関数)の引数でRequestオブジェクトを指定すると、リクエストデータを取得できます。
web.php
Route::get('/item', function (Request $request) {
});
デバッグ関数
dd()
Laravelのデバッグ関数に dd() があり、オブジェクトの中身を表示して強制終了します。
dd(オブジェクト);
Requestオブジェクトのデバッグ
Requestオブジェクトをデバッグしてみましょう。
Route::get('/search', function (Request $request) {
dd($request);
});
ブラウザでアクセス
「/item?page=1」でアクセスして確認します。
パラメータ確認
「query」を開くと「keyword=tokyo」のパラメータが格納されています。
パラメータの取得
パラメータ取得は、Reuqestオブジェクトのパラメータ名で指定します。
$request->パラメータ名
pageパラメータ取得
Reuqestオブジェクトから「page」パラメータを取得して、メッセージを表示してみましょう。
Route::get('/search', function (Request $request) {
$message = "Page is {$request->keyword}";
return $message;
});
ブラウザで確認
「page」パラメータの任意の値でメッセージが変わりました。