前回までの記事で、MVCのV部分であるビューについて解説しました。
今回はMVCのC部分であるコントローラについて解説します。
コントローラの役割
WEBページの具体的な処理は、コントローラを使って行われます。
必要に応じてモデルを使ってデータを取得したり、ビューを利用して画面表示を作成したりします。
コントローラは処理全体の制御を担当するプログラムの本体部分とも言えます。
コントローラの作成
では実際にコントローラを作成してみましょう。
コマンドプロンプトで、以下コマンドを実行します。
php artisan make:controller HelloController
ここでは、「HelloController」という名前のコントローラを作成しています。
コントローラは通常、「○○Controller」というように、名前の後に「Controller」を付けた形で命名します。
作成したControllerの確認
では作成されたコントローラのファイルの確認をしてみましょう。
コントローラは「app」フォルダの「Http」フォルダの中にある「Controllers」フォルダの中に作成されます。
ここに作成された「HelloController.php」ファイルをテキストエディタで開くと、以下のようなスクリプトが記述されています。
[HelloController.php]
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; class HelloController extends Controller { // }
これがコントローラの基本ソースコードとなります。
ポイントを整理していきましょう。
名前空間
コントローラはクラスとして作成され、このクラスは「App\Http\Controllers」という名前空間に配置されます。
namespace App\Http\Controllers;
名前空間とは、クラスを階層的に整理するための仕組みとなります。
フォルダを使用して階層的にファイルを整理するのと同じイメージです。
useによるクラスのインポート
次に記述されているのはuse文です。
use Illuminate\Http\Request;
ここでは、Illuminate\Httpパッケージ内に用意されている「Request」を状態にしています。
クラスの定義
続いてクラスの定義がされています。
ここでは、HelloControllerクラスが以下のように定義されています。
class HelloController extends Controller { // }
コントローラクラスは、このようにControllerというクラスを継承して作成します。
これでコントローラクラスは用意できました。
あとはここに具体的な処理をメソッドとして追加していきます。
アクションを追加する
では、コントローラに処理を追加していきましょう。
コントローラに用意されている処理は、「アクション」と呼ばれます。
これはメソッドの形で用意します。
アクションはコントローラに用意される処理を行うためのもので、複数用意することができます。
では、HelloController.phpを以下のように書き換えます。
[HelloController.php]
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; class HelloController extends Controller { public function index() { return view('hello.index'); } }
ここでは、HelloControllerクラスの中に「index」というメソッドを追加しています。
これがアクションとして使われるメソッドです。
アクションメソッドでは、returnでviewメソッドを返しています。
viewメソッドは、引数に指定されたテンプレートを読み込んで返します。
ルート情報の用意
これでコントローラにアクションは用意できましたが、これだけでは表示はされません。
アクションを使用可能とするには、アクションにルートを割り当てる設定が必要となります。
「routes」フォルダのweb.phpを開いて、以下の記述を追加します。
Route::get('hello', 'HelloController@index');
Route::getを使って、ルート情報を設定しています。
ここでは、第2引数に「HelloController@index」というテキストが用意されています。
コントローラを利用する場合は、このように第2引数に「呼び出すコントローラとアクション」を指定します。
これは、’コントローラ名@アクション名‘というように、コントローラとアクションを@で繋げて記述します。
これにより、第1引数のアドレスにアクセスされると、第2引数に指定されたコントローラのアクションが実行されるようになります。
複数アクションの利用
先述した通り、コントローラは複数のアクションを用意することができます。
複数のアクションを用意した場合、どのようにアクセスされるのでしょうか?
試してみましょう。
HelloController.phpのHelloControllerクラスを以下のように修正します。
[HelloController.php]
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; class HelloController extends Controller { public function index() { return view('hello.index'); } public function other() { return view('hello.other'); } }
コントローラの記述ができたら、続けてルーティングも用意しておきましょう。
「routes」フォルダのweb.phpを開いて、以下の記述に修正しましょう。
Route::get('hello', 'HelloController@index'); Route::get('hello/other', 'HelloController@other');
ここでは、HelloControllerコントローラクラスに、「index」と「other」という二つのアクションメソッドを用意してあります。
そしてweb.phpにて、/helloにindexを、/hello/otherにotherをそれぞれ割り当てています。
ページが複数になっても、このように基本的な実装の仕方に変わりはありません。
ただし、割り当てるアドレスには注意が必要です。
アクションとアドレスの関係
ここでは、/helloと/hello/otherにアクションを割り当てています。
基本的に、アドレスとコントローラまたはアクションの関連は、以下のように対応させるのが一般的です。
http://アプリケーションのアドレス/コントローラ/アクション
HelloControllerのindexアクションならば、/hello/indexとしておくのが一般的です。
ただしWebの世界では、indexは省略してアクセスできるようにしておくのが一般的なので、/helloでアクセスできるようにしてあります。
同じ考え方で、otherアクションは/hello/otherに割り当ててあります。
これは、一般的にこうするということであって、そうしなければいけないというわけではありません。
例えば、アクションメソッドが「getNextPageAction」という名前であれば、/hello/getnextpageactionとするよりも、アクション名を省略して/hello/nextとしておくべきです。
より分かりやすいアドレスにするために、コントローラ名やアクション名を省略するのはよくあることです。