Laravel5でルーティングとコントローラー

前回の続きです。Laravel5をインストールしたらまずは普通にページを表示させてみます。が、実はpublicディレクトリにphpファイルを直置きするとそれはそれで機能します。ここはSymfonyよりもかなりゆるいところです。ですが設計上はあまりやりたくないところです。

ルーティング

Laravel5はその他のフレームワークと同様にページの作成はすべてMCVで行います。基本的にはすべてコントローラーを介して情報を返すというのがMCVの役目なのでアクセスされたページがどのコントローラーと紐付いているのかを決定しなくてはなりません。その役目がルーティングになります。
各ページのルーティングは
app/Http/routes.php
にまとめて記述します。

無名関数で文字列だけ表示する

ここでは単にルーティングしたページにアクセスしたら文字列を表示するというだけなので、いわゆる無名関数でその内容を表示します。デフォルトでwelcomeページが表示されるようになっていますが、以下のように編集してみます。

Route::get('/test/', function() {
return 'Laravel5 Test');
});

これでhttp://example.com/test/にアクセスするとページが「Laravel5 Test」が表示されます。ここではまだコントローラーが指定されていません。実際はもっと複雑な値を返す必要があります。(余談ですがLaravelはSymfonyほど極端なMCVに固執しないのでその点は楽です。)
Route::get()関数の第一引数がURLのパスになります。第二引数が返す値、つまり表示させる値になります。ここでは無名関数でそのまま文字列を返しているので'Laravel5 Test'が表示されるということになります。

コントローラーを使う

コントローラーは自分で書くこともできますが、Laravel5にはコントローラーを作成するコマンドがあります。これを使うと正確にコントローラーのひな形を作成することができるのでとても楽ちんです。
ルーティングでは先の例と同様Route::get()関数の第一引数がURLのパス、第二引数がコントローラーの値になります。
Route::get('/test/', 'TestController@index');
先の無名関数のルーティングからコントローラーを使った方法に書き換えてみましょう。
さてコントローラーはどこに作ればよいのかというと、
app/Http/controllers/*
になります。TestController@indexの@マーク前がコントローラー名(ファイル名)で@マーク以後がメソッド名になります。コントローラーはいわゆるclassファイルなのでその中のメソッド名public function index() {...}が実行されるということになります。つまり
app/Http/Controllers/TestController.phpのSampleControllerクラスのindex()メソッドが実行されます。これ、なんでそうなるのということではなくフレームワークのルールです。

コントローラを作成します。コントローラーはコマンドを使いましょう。(使わなくてもいいけど。)
$ php artisan make:controller TestController
これを実行するとapp/Http/Controllers/TestController.phpが作成されます。Controller created successfully.と出たらOKです。
作成されたコントローラーを開いて中身を確かめてみます。コントローラのひな形なのでいろいろなものがいっぺんにつめ込まれています。httpアクセスに必要な共通のライブラリーがuseで読み込まれています。またこの個別のコントローラーはControllerという抽象クラスの拡張クラスだということもわかります。
いろいろありますが、今回はindex()メソッドの部分だけ見てみます。
/**
* Display a listing of the resource.
*
* @return Response
*/
public function index()
{
//
}

となっています。これはメソッドが定義されているだけで返り値がないです。なので返り値を作ってあげます。
/**
* Display a listing of the resource.
*
* @return Response
*/
public function index()
{
return view('何か適当なテキスト');
}

このときview()関数で返してあげます。なんでかというとそういう規則だからです。勿論他にもいろいろな関数があって用途にとっていろいろですが、ここでは入門編なのでview()で返しておきましょう。
これでexample.com/test/にアクセスするとコントローラから値を返したページが表示されます。

テンプレート

とはいいつつ、httpのアクセスではHTMLタグで組まれた複雑な要素を返します。結局のところ、
・ルーティングしたアクセスURLに対して、
・コントローラーが起動し何らかの値をテンプレートに渡して、
・テンプレートで表示する情報を返す
という風になります。AjaxやXMLなんかも基本同じです。
Larabel5では、bladeというテンプレートエンジンを使います。SmartyとかTwigとかと同じようなテンプレートなので特に難しいものではありません。

コントローラーからテンプレートを紐付けるにはview()をreturnで返します。
return view('test');
このときのパラメーターがテンプレートになります。このパラメーターが以下のパスのテンプレートを読み出すという仕掛けになっています。
resources/views/test.blade.php
filename.blade.phpがそのテンプレート名になります。
テンプレートは名前空間を持つことができるので、views以下でも入れ子にすることができますが、こちらは次回にします。

http://qiita.com/michiomochi@github/items/de19c560bc1dc19d698c
http://qiita.com/fluke8259/items/c9525ebde6fcd072730a