この記事では、PHPのフレームワークであるLaravelで、MVCのコントローラーについての基本を説明します。
コントローラの作成
Laravelでは、artisanのmake:controller
コマンドで、MVCのコントローラーに相当するクラスのひな型を作ることができます。例えば、"DoubleController"というクラスを作りたい場合は、下記のコマンドを実行します。
$ php artisan make:controller DoubleConrtoller
Controller created successfully.
実行後にgit status
で差分を見ると、プロジェクトの中にファイルapp/Http/Controllers/DoubleController.php
が追加されていることを確認できます。
$ git status
On branch master
Untracked files:
(use "git add <file>..." to include in what will be committed)
app/Http/Controllers/DoubleController.php
nothing added to commit but untracked files present (use "git add" to track)
追加されたファイルの中身は空っぽです。
# more app\Http\Controllers\DoubleController.php
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class DoubleController extends Controller
{
//
}
作成されたコントローラにアクションを追加する
以下のようにControllerのひな型にメソッドを追加して、アクションを作ります。今回はindex()アクションを追加し、渡された値の2倍の値を返す処理を作りました。
# app\Http\Controllers\DoubleController.php
<?php
... 略 ...
class DoubleController extends Controller
{
public function index($number=0)
{
return $number * 2;
}
}
作成したアクションに応じたルーティングを追加する
次に、routes/web.php
に対して、先ほど作成したアクションが呼ばれるようにルーティングを追加します。コントローラを使う場合のルーティング指定は、第二引数に"クラス名@メソッド名"の形式で実行したいアクションを文字列で指定します。
Route::get('/double/{number?}', 'DoubleController@index');
これで渡された値を2倍するプログラムを作成しました。例えば、ブラウザからhttp://localhost:8080/double/10にアクセスすると20が返されます。
コントローラを1クラス1アクションにする
Laravelでは、各モデルクラスに実装するアクションを1つのみに制限するシングルアクションコントローラ(Single Action Controllers)でのコントローラ作成もサポートしています。
この場合、先ほどはindex()というメソッド名でアクションを作成しましたが、代わりに__invoke()の名前でメソッドを作成すればよいです。__invokeメソッドは、名前の先頭にアンダーバーが2つあることからも分かるように、PHPの機能(マジックメソッドという機能)を利用して実装しています。
というわけで、実際に作ってみましょう。
先ほどと同じように、make:controllerでコントローラを作成します。今回はTripleControllerの名前でコントローラーを作成しました。
$ php artisan make:controller TripleController
Controller created successfully.
作成されたファイルapp/Http/Controllers/TripleController.php
には__invoke()メソッドを作成します。
class TripleController extends Controller
{
//
public function __invoke($number = 0)
{
return $number * 3;
}
}
ルーティングを担当するroutes\web.php
には、下記の定義を追加します。先ほどと異なり、第二引数にはクラス名だけを記述します。
Route::get('/triple/{number?}', 'TripleController');
これで、http://localhost:8080/triple/5のURLアクセスすると15と表示される、3倍の値を返すプログラムが作成できました。