Laravel - 5. コントローラ

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

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

コントローラの作成

コントローラを作成するには ./vendor/bin/sail artisan make:controller コマンドを使います。

$ ./vendor/bin/sail artisan make:controller コントローラクラス名

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

$ ./vendor/bin/sail 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::class, 'index']);

上記のように Route::get メソッドは第2引数にコントローラクラスとアクションを配列で指定します。配列の先頭要素には HelloController::class のようにクラス名を指定し、2番目の要素にはアクション名を文字列で指定します。

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

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

$ ./vendor/bin/sail artisan route:list --compact
+----------+---------------------+------------------------------------------------------------+
| Method   | URI                 | Action                                                     |
+----------+---------------------+------------------------------------------------------------+
| GET|HEAD | /                   | Closure                                                    |
| GET|HEAD | api/user            | Closure                                                    |
| GET|HEAD | hello               | App\Http\Controllers\HelloController@index                 |
| GET|HEAD | sanctum/csrf-cookie | Laravel\Sanctum\Http\Controllers\CsrfCookieController@show |
+----------+---------------------+------------------------------------------------------------+

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

動作確認

HelloController クラスを作成して、ルーティングテーブルの定義を確認できたので、ブラウザからWebアプリケーションにアクセスしてみましょう。

http://localhost/hello

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

まとめ

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