コントローラーについて
webページの基本的な処理はコントローラを使って行うのが基本です。
またMVCアーキテクチャの基本となるものです。
MVCとコントローラ
ルーティングはアクセスしたアドレスをもとに処理を割り振る役割でした。ただそれだけではなく、具体的に実行するべき処理は別に用意されていて、それを特定アドレスに割り振って呼び出すための処理です。
MVCとはモデル、ビュー、コントローラの頭文字をとったものです。
モデルはデータ処理全般を担当します。具体的にはデータベースに関する処理全般を司ると言って良いと思います。
ビューは画面表示を担当します。表示に使うテンプレートなどがこれに相当します。
コントローラは全体の制御を担当します。必要に応じてモデルからデータを取得したりビューを利用して画面表示を作成したりします。
コントローラの作成
作成中のアプリのフォルダディレクトリで以下のコマンドを実行することで作成できます。
php artisan make:controller HelloController
これによってHelloControllerが作成できます。
ちなみにHelloの部分の名前を変えることで違うコントローラ名で作成することができます。
下記はHelloController.phpの中身です。
順番に内容を見ていきます。
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class HelloController extends Controller
{
//
}
controllersと名前空間
コントローラはクラスとして作成されます。このクラスはApp\Http\Controllersという名前空間に配置されます。
名前空間とはクラスを階層的に整理するための仕組みです。フォルダを使って階層的にファイルを管理するのと同じだと思っておけばいいと思います。
一行目のnamespace App\Http\Controllers;
は名前空間を指定しています。
useによるインポート
次に記述されているのはuse文です。以下のように記述されています。
use Illuminate\Http\Request;
ここではIlluminate\Httpパッケージ内に用意されているRequestを使える状態にしています。
まだこの段階ではRequestは不要ですがこれから多用することとなるクラスのためデフォルトでuse文が追加されています。
クラスの定義
続いてクラスが提起されています。HelloControllerは以下のように定義されています。
class HelloController extends Controller
コントローラクラスはこのようにControllerというクラスを継承して作成します。
アクションを追加する
コントローラに用意される処理はアクションと呼ばれる。これはメソッドの形で用意されます。
今回は以下のようにindexメソッドを追加してみます。
ここではindexのように引数を持たないメソッドとして用意されています。(場合によっては引数を用意することもあります。)
アクションメソッドはreturnを使ってHTMLのコードを返しています。結果、returnした内容がウェブブラウザに返され表示されることになります。
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class HelloController extends Controller
{
public function index() {
return <<<EOF
<html>
<head>
<title>Hello/Index</title>
<style>
body {font-size:16pt; color:#999; }
h1 { font-size:100pt; text-align:right; color:#eee;
margin:-40px 0px -50px 0px; }
</style>
</head>
<body>
<h1>Index</h1>
<p>これは、Helloコントローラのindexアクションです。</p>
</body>
</html>
EOF;
}
}
ただこれだけでは表示はできません。ルーティングを変更する必要があります。
web.phpを開き先程の記述を削除しルーティングを変更していきます。
Route::get('hello', 'HelloController@index');
第二引数には関数ではなくコントローラ名@アクション名が記述されています。
これにより第一引数のアドレスにアクセスしようとすると第二引数に指定されたアクションが実行されるようになります。
コントローラを使ったルートパラメータの利用
ルートパラメータ(アクセスする際にパラメータとして値を渡すことができる)を使用する場合は以下のように編集します。
class HelloController extends Controller
{
public function index($id='noname', $pass='unknown') {
return <<<EOF
<html>
<head>
<title>Hello/Index</title>
<style>
body {font-size:16pt; color:#999; }
h1 { font-size:100pt; text-align:right; color:#eee;
margin:-40px 0px -50px 0px; }
</style>
</head>
<body>
<h1>Index</h1>
<p>これは、Helloコントローラのindexアクションです。</p>
<ul>
<li>ID: {$id}</li>
<li>PASS: {$pass}</li>
</ul>
</body>
</html>
EOF;
}
}
ルーティングも以下のように編集していきます。
Route::get('hello/{id?}/{pass?}', 'HelloController@index');
これによって/hello/taro/yamadaというようにhelloの後に二つのパラメータをつけてアクセスするとそれらのパラメータが画面に表示されます。