Laravelでプログラムを書き進めていくにあたって必須になってくるのがルーティングという仕組みです。これを理解していないとウェブページに画面を出力することができません。
今回はそんな、Laravelを始めて最初に勉強することになるであろうルーティングの仕組みについてまとめました。
通常のウェブサイトのディレクトリ構造
通常ウェブサイトにページを表示させたいときにはそのディレクトリにファイルを置くことで表示できるようになります。つまり、ホームディレクトリからのパスとURLが一致するような構造になっています。
例えばブラウザで「http://ドメイン名/hello/world.html」とアクセスすると、ホームディレクトリ直下のhelloディレクトリの中のworld.htmlが呼び出されて表示されます。
また、indexという名前のファイルは省略して表されることが多いので、「http://ドメイン名/」とアクセスすると、ホームディレクトリ直下のindex.htmlが呼び出されます。
ここまではウェブに関する知識があれば知っているという方も多いと思います。
LaravelのようなMVCというフレームワークではこういった構造になっておらず、特別な仕組みにでURLに対する処理を分けるような感じになっています。それが以下で説明するルーティングという仕組みです。
Laravelのルーティング
Laravelでは入力されたURLに対する処理をルーティングという仕組みで処理しており、ファイルへのパスとは全く関係なく動くようになっております。
ルーティングの役割は以下の画像のイメージです。
実際にやってみるのがいいと思うので、Laravelをインストールしたフォルダからroutesというフォルダを探し、その中のweb.phpというものを開いてみましょう。
Route::get('/', function () {
return view('welcome');
});
初期状態だと以上のように書かれているかと思います。
このroutes/web.phpというファイルがURLと呼び出すファイルや処理の紐付けを行っており、このデフォルトに書かれている処理によってLaravelの初期画面が書かれているファイルを呼び出しています。
デフォルトのルーティングの処理の流れ
ではこのデフォルトに書かれているルーティングの処理について見ていきます。まず、Routeのgetメソッドについて、見ていきます。
getメソッドの詳細は以下の通りです。
Route::get(ドメイン以下のアドレス, 実行する関数);
第一引数の説明
第一引数にはドメイン以下のアドレスを指定します。
デフォルトに書かれている「’/’」とはトップページすなわちLaravelプロジェクトのURL以下に何もつけなかった場合という意味になります。
第二引数の説明
第二引数には呼び出すコールバック関数を入れており、この戻り値が実際に表示されているような形となっています。
ではデフォルトの第二引数に書かれている以下の無名関数の戻り値であるview(‘welcome’)とはどのファイルを呼び出しているのでしょうか?
function () {
return view('welcome');
}
こちらはviewという関数にてresources/views/フォルダを参照し、引数の’welcome’にてフォルダ中のwelcome.blade.phpを呼び出してねという処理になっています。
まとめると
以下の処理は、LaravelプロジェクトのURL以下に何もつけないで呼び出された場合、resources/views/welcome.blade.phpを呼び出してくださいという処理になります。
Route::get('/', function () {
return view('welcome');
});
welcome.blade.phpを開くとわかると思いますが、実際に書かれているのはhtmlのコードになっていて、これが表示されているというわけです。
様々なルーティングの書き方
では、ここからルーティングの書き方についていくつか紹介します。
文字列を返す
以下は「/hello」にアクセスするとreturnで記述された文字列を表示します。
Route::get('hello', function () {
return 'Hello World';
});
変数を用いて文字列を返す
以下は「/hello」にアクセスしたときgetメソッド外に変数を用意して使用する例です。
$hello = 'Hello World';
Route::get('hello', function () use ($hello) {
return $hello;
});
HTMLを返す
以下は「/hello」にアクセスするとreturnで記述されたhtmlを表示します。
Route::get('hello', function () {
return '<html><body><h1>Hello World</h1></body></html>';
});
ルーティングパラメタの受け取り
以下は「/hello/OO」という形でアクセスしたとき、(OOはどんな文字列でもOK)そこに記載された文字列を変数$worldに引き渡して使えるようになります。
Route::get('hello/{world}', function ($world) {
return '<html><body><h1>Hello '.$world.'</h1></body></html>';
});
ルーティング任意パラメタの受け取り
先程の場合だと「/hello」とアクセスするとエラーになってしまうので、それを回避するには以下のように書きます。
Route::get('hello/{world?}', function ($world = '') {
return '<html><body><h1>Hello '.$world.'</h1></body></html>';
});
もし「/hello」以下に何も指定されなかった場合は、デフォルトとして”が入るようになりエラーにならなくなります。
view関数でbladeファイルを返す
以下は「/hello」にアクセスするとresources/views/hello/index.blade.phpを呼び出します。区切りにはスラッシュではなく、ドットを用います。
Route::get('hello', function () {
return view('hello.index');
});
view関数でbladeファイルに変数を与える
また、view関数の第二引数に連想配列を指定することで、ファイルに変数も渡せます。
Route::get('hello/{world}', function ($world) {
return view('hello.index', ['world' => $world]);
});
これでresources/views/hello/index.blade.php内で、変数$worldが使用できます。
まとめ
ルーティングについていかがだったでしょうか。
簡単に言うとルーティングとはURLと呼び出す処理を紐づけるものということがわかりました。
ルーティングの次はコントローラという箇所で処理が行われます。
コントローラに関する記事も書きましたので良かったら目を通していっていただけると嬉しいです。
LaravelのようなMVCと呼ばれるフレームワークでは、表示部分と処理部分を分けて書くように設計されており、その2つの仲介役的な役割をコントローラが担います。 前回ルーティングのやり方について[…]
最後に… Laravelを勉強し始めでもっと勉強したいなら以下の本がおすすめです。