Laravel5.5のコントローラー入門

カテゴリ: Laravel

この記事では、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倍の値を返すプログラムが作成できました。

こちらもおススメ

コメントを残す

メールアドレスが公開されることはありません。