ルーティングについて
一般的にはHTTPにおけるWEBサーバーの仕事はブラウザから要求されたHTMLファイルを返すことです。
ブラウザが求めるHTMLファイルはURLに記述されています。
そこにはファイルが収納されているディレクトリなども併せて記述されていて、WEBサーバーに管理者権限でアクセスして所定のデレクとりをたどってゆくと、ちゃんと対応するHTMLファイルがあります。
しかし、Laravelを含めたフレームワークによるWEBシステムはこうした仕組みを取りません。
フレームワークは届いたURLを見て、それに相応するファイルを返すのではなく、相応するプログラム処理を開始します。
〇〇というURLが届いたら××という処理を呼び出すべし。
この〇〇と××の関連性を管理するのがルーティングです。
ルーティングに関する情報はルートと呼ばれるファイルに記述されています。
Laravelでは
routesディレクトリ配下のweb.phpファイルがそれに相当します。
ルーティングの動き方についてはデフォルトで生成されているLaravelファイルの記述を見ながらたどってゆくとわかりやすく理解できます。
web.phpファイルを開いてみます。
Route::get('/', function () {
return view('welcome');
});
と書かれているのがルーティングの定義です。
・Route::get は継承したRouteクラスに定義されているget関数
・第一引数 '/' はURLの末尾が'/' つまりアプリケーションのトップページのURLがリクエストされた場合 という意味です。
現時点の設定ではトップページは「http://127.0.0.1:8000」ないしは「localhost:8000」。これがリクエストされたら、ということです。
・第二引数 function(){・・} は第一引数のURLがリクエストされた場合の処理を規定します。ここでは return view('welcom'); の処理を行うべし、です。
・return view('welcom'); はViewで規定されている'welcom.blade.php'を返せ、という意味です。このViewと**.blade.php ファイルについては別の投稿で詳説します。
・'welcom.blade.php'にはLaravelのデフォルトのウェルカムページが記述されています。
つまり、トップページ「http://127.0.0.1:8000」ないしは「localhost:8000」がリクエストされたらwelcom.blade.phpに書かれているウェルカムページを返す処理を行う、ということがここで規定されています。
ルーティングはこのようにURLリクエストを見てLaravelのMVC処理に渡す前の前裁きをしていると、理解することができます。
コントローラーとの関係
デフォルトのルートでは第二引数が直接メソッドになっていましたが、複雑な処理や表示をここに記述するのは現実的ではありません。
MVCモデルではデータベース処理やWEB表示を行う機能群の中心に司令塔のような役割をするコントローラーがあります。
ルートの第二引数には、任意のコントローラーとその中の特定機能に処理を転送する旨の記述をすることができます。
例文を書いてみます。
Route::get('/', 'App\Http\Controllers\DmenController@showFront')->name('front');
・第一引数 '/' はURLの末尾が'/' つまりアプリケーションのトップページのURLがリクエストされた場合 という意味です。
・第二引数の前半部'App\Http\Controllers\DmenController'はコントローラーファイルの指定。
Laravelの最近のバージョンではこのコントローラーファイルの指定は古パスで行わなければならないようです。
コントローラーファイル'DmenController.php'は現時点ではまだ作成していません。あとで作成します。
・第二引数の後半部、@から先のshowFront が'DmenController.php'のなかに記述されたメソッドになります。
・つまり第二引数は@から前に記述してあるコントローラーファイルに書かれている@より後のメソッドに処理を渡すべし、という記述になります。
・getメソッドの後に->name('front') というキャストがありますが、これはこのルートに'front'という名前を付けます、という意味です。
MVCが複雑になるとコントローラーの中にもルートに関する記述をここかしこにしなければならず、その際にこうしてネーミングされていると記述が簡略化できます。
このルートと連携するコントローラーの生成や記述については別途の投稿で詳説します。
ルートパラメータ
先に触れたように、get関数(実はgetだけではない)の第一引数にはURLを記載するわけですが、このURLはサーバー内のディレクトリを意味しません。
'/'以降に記載される情報はルートパラメータといって、変数として第二引数に引き渡すことができます。
例:Route::get('/{msg}',function($msg){---------});
第一引数の{msg}がパラメータ名、第二引数のfunction関数の引数に$msgを引用することで、このパラメータ名を引き渡します。
下の例では-----部にHTMLコードを記載しています。
このコードに中に変数$msgが利用されています。
URLとして
「localhost:8000/変数として引き渡されます」
を指定すると「変数として引き渡されます」がHTMLに引き継がれ、ブラウザに表示されます。
ルートパラメータは複数指定することができます。
例:例:Route::get('/{msg}/{name}',function($msg,$name){---------});
第一引数に{msg}と{name}をパラメータ名として設定し、第二引数のfunction関数の引数に$msgと$nameを引用して、このパラメータ名を引き渡します。
URLとして
「localhost:8000/こんにちわ/kikaku0196」
を指定すると「こんにちわ」と「kikaku0196」がHTMLに引き継がれ、ブラウザに表示されます。
以上の例では第二引数にfunction関数を指定しましたがルートパラメータをコントローラーに引き渡すことも可能です。
詳説は別投稿で行います。
Route::post() について
ブラウザから指定されたURLから判断してMVCでHTMLを生成、表示を返す場合、Routeは上記のようにget関数を用います。
しかし、フォームなどでPOST先の指定がなされる場合、その遷移はどのようなRouteを辿るのでしょうか?
この場合の遷移を想定してRouteにはpost()関数も用意されています。
基本的にはget()関数と同じ構文です。
所定のフォームページで
method = 'post'
action = '/resi'
name= 'namae'
例:Route::post('/resi','DmenController@post');
としてコントローラー側でpost()メソッドを用意し、その中で連想配列を紐解き'namae'に関連づいているデータを取り出します。
具体的な解説についてはまだコントローラーの説明をしていないので、後述します。
以上がRouteに関する解説です。
LaravelではMVCとの関連で常にRouteが登場しますので、今後も折に触れてRouteに関連するTipsを紹介してゆきます。
Comments