Laravel - 5. コントローラ

ルーティングの仕組みについて学習したので、次はMVCモデルを構成する要素の一つであるコントローラについて見ていきましょう。

Laravelのコントローラはルーティングから呼び出されるプログラムです。先ほどのサンプルプログラムでは無名関数(クロージャ)を使って処理を実装していましたが、コントローラクラスを作成して処理を実装することもできます。一般的なWebアプリケーションを開発する場合は routes/web.php ファイルに直接処理を記述するのではなく、コントローラクラスを作成する方がプログラムのメンテナンス性を高めることにつながるでしょう。

コントローラの作成

コントローラを作成するには php artisan make:controller コマンドを使います。

$ php artisan make:controller コントローラクラス名

コマンドの実行時にはコントローラクラス名を指定するようにします。ここでは HelloController という名前のコントローラクラスを作成してみましょう。コマンドラインから次のように入力します。

$ php artisan make:controller HelloController
Controller created successfully.

コマンドが成功すると Controller created successfully. というメッセージが表示されます。このとき app/Http/Controllers/HelloController.php ファイルが作成されています。 テキストエディタを開いて app/Http/Controllers フォルダの中から app/Http/Controllers/HelloController.php ファイルを開いてみましょう。

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class HelloController extends Controller
{
    //
}

Laravelのコントローラクラスは Controller クラスを継承して作成します。作成した HelloController クラスには必要に応じてプロパティやメソッドを追加します。ここでは手始めに index という名前でメソッドを追加してみましょう。

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class HelloController extends Controller
{
    public function index()
    {
        return "Hello Controller!";
    }
}

作成した index メソッドは戻り値に "Hello Controller!" という文字列データを返します。このようにコントローラクラスに定義したメソッドのことをアクションやアクションメソッドなどと呼びます。このアクションメソッドは以前に学習したルーティング情報( routes/web.php )と関連付けることができます。

routes/web.php を修正して HelloControllerindex アクションとの関連付けてみましょう。

<?php

Route::get('/', function () {
    return view('welcome');
});

Route::get("/hello", "HelloController@index");

上記のように Route::get メソッドは第2引数にコントローラクラスのアクションを指定します。クラス名とアクション名の文字列の間には @ を記述します。

ルーティングテーブルの確認

続いてルーティングテーブルを確認してみましょう。コマンドラインから php artisan route:list コマンドを入力します。

$ php artisan route:list
+--------+----------+----------+------+--------------------------------------------+--------------+
| Domain | Method   | URI      | Name | Action                                     | Middleware   |
+--------+----------+----------+------+--------------------------------------------+--------------+
|        | GET|HEAD | /        |      | Closure                                    | web          |
|        | GET|HEAD | api/user |      | Closure                                    | api,auth:api |
|        | GET|HEAD | hello    |      | App\Http\Controllers\HelloController@index | web          |
+--------+----------+----------+------+--------------------------------------------+--------------+

hello のAction列に App\Http\Controllers\HelloController@index と出力されているのがわかります。

動作確認

HelloController クラスを作成して、ルーティングテーブルの定義を確認できたので、PHPのビルトインWebサーバを使ってWebアプリケーションを起動してみましょう。次のようにコマンドを入力します。

$ php artisan serve --host 0.0.0.0
Laravel development server started: http://0.0.0.0:8000

続いてブラウザを起動してWebアプリケーションにアクセスしてみましょう。

http://localhost:8000/hello

実行結果のように画面に Hello Controller! という出力を確認できるでしょう。 /hello というパスへのGETリクエストに割り当てられたアクションメソッド( HelloController クラスの index メソッド)が動作しているのがわかります。

まとめ

  • コントローラはルートと関連付けるプログラム
  • php artisan make:controller コマンドでコントローラクラスを作成する
  • コントローラではリクエストの解析、モデルの呼び出し、ビューの制御などを行う