概要
Laravelにおけるルーティング周辺について書いていくよ
初心者向けの内容だよ
routing
ルーティングとは、クライアントからのアクセスに対応してどういう処理をするか決めること
例えば、「http://.../○○というアドレスにアクセスしたら、××コントローラの△△アクションを実行する」みたいな感じ
ルーティングが記述されたファイルは、routesフォルダのweb.phpだよ
※以下のソースコードで、デフォルトのnamespaceやuseは省略
基本
// (1)
Route::get('/', function() {
return view('welcome');
});
// (2)
Route::get('/', 'HelloController@index');
書式は以下の通り
// (1)
Route::get('path', クロージャ); // クロージャの中にpathに対応する処理を書く
// (2)
Route::get('path', 'コントローラ名@アクション名');
HTTP動詞に対応して
- Route::get
- Route::post
- Route::put
- Route::patch
- Route::delete
などが同様に使える
(1)のクロージャの中の関数viewは引数にテンプレート名をしてすることでレンダリングされる
つまり、(1)は「'/'にアクセスされたらテンプレート'welcome'をブラウザに表示させる」ということ
(2)は「'/'にアクセスされたら、Helloコントローラのindexアクションを実行する」ということ
Helloコントローラは、例えば、以下のような感じ
class HelloController extends Controller
{
public function index() {
return view('welcome');
}
}
(1)と(2)の使い分けは、ビューだけを表示させるなら(1)、処理が多いと(2)とかかな
本格的なアプリだとモデル使うので確実に(2)を使うし、ビューだけ表示させることが少ないなら(2)に統一したほうが見やすいよね
Readoubleによると、ビューを返すだけならRoute::viewを使うといいらしいので(1)の出番はほぼないね(とは言っても一応説明はしておく)
Route::view('/', 'welcome', ['param'=>'Hello']);
Route::view('path', 'テンプレート名', パラメータ); // パラメータは任意
必須パラメータ
// (1)のタイプ
Route::get('index/{msg}', function($message) {
return view('hello.index', ['msg'=>$message]);
});
上の例だと、「'/index/test'とアクセスされたら、'test'が$messageに代入されて、helloフォルダのテンプレート'index'をブラウザに表示する」ということになる
この時、テンプレート'index'内の$msgに$message(つまり'test')が代入されるよ
見ればわかるけど、パラメータ名とクロージャの引数の名前は一致しなくてもいい
複数のパラメータがあると、順に代入される
Route::get('index/{id}/{name}', function($param1, $param2) {
return view('hello.index', ['id'=>$param1, 'name'=>$param2]);
});
例えば、上の例だとidは$param1、nameは$param2に代入される
(2)のタイプも以下に示しておこう
// (2)のタイプ
Route::get('index/{msg}', 'HelloController@index');
class HelloController extends Controller
{
public function index($message) {
return view('hello.index', ['msg'=>$message]);
}
}
任意パラメータ
パラメータの後ろに?をつけると、そのパラメータがなくてもルーティングが通る
// (1)のタイプ
Route::get('index/{msg?}', function($message='Hello') {
return view('hello.index', ['msg'=>$message]);
});
上の例だと、'/index/test'というパスも'/index'というパスもエラーを出すことなく通る
ただし、代入先の変数はデフォルト値を与えておく必要がある(上の例では'Hello'をデフォルトにしている)
(2)のタイプも以下に示そう
// (2)のタイプ
Route::get('index/{msg?}', 'HelloController@index');
class HelloController extends Controller
{
public function index($message='Hello') {
return view('hello.index', ['msg'=>$message]);
}
}
おわり
ルーティングの基礎について書いてみました
簡単なアプリであれば、Route::getとRoute::postだけあればいける
私は今のところ(2)のタイプしか使わないね