Laravel入門#06(コントローラ)

今回はLaravelを使うにあたり重要な要素である「コントローラ」について説明・使用をしていきたいと思います。

MVC(Model View Controller)

コントローラの使用方法の説明の前に、まずはコントローラとは何か?という処を説明していきたいと思います。

Webアプリケーション開発では、「MVC」という言葉をよく耳にしますが、
それぞれModel、View、Controllerの頭文字をとって「MVC」です。

また元々はGUIアプリケーションに適用するためのアーキテクチャで、Webアプリケーションで使われているMVCはサーバサイドに適用したもので「MVC2」と呼ばれます。

Model(モデル) アプリケーションが扱うデータの操作など主にビジネスロジックを担当
View(ビュー) Modelのデータ状態を参照して画面に表示するなど画面表示を担当
Controller(コントローラ) Model・Viewの選定を行う。全体の制御を担当

表の通り、コントローラとは全体を制御するためのLaravelフレームワークで実行される処理の基点となり、MVCを使用する上で重要な位置付けになるものです。

コントローラを作成してみよう

上述の通りWebアプリケーションを開発するには、司令塔となるコントローラを作成する必要があります。

Laravelでは標準でコントローラを作成するartisanコマンドが用意されていますので、そちらを使ってコントローラを作成してみましょう。
まずコマンドで「HelloWorldController(名前は任意)」を作成します。

$ php artisan make:controller HelloWorldController
Controller created successfully.

実行後は「app/Http/Controllers/」直下に「HelloWorldController.php」が作成されていると思います。
こちらを開いてみると以下のようなファイルが書かれていることがわかります。

app/Http/Controllers/HelloWorldController.php
<?php
// ①:名前空間
namespace App\Http\Controllers;

// ②:クラスのインポート
use Illuminate\Http\Request;

// ③:クラスの定義
class HelloWorldController extends Controller
{
    //
}

①:名前空間

artisanコマンドで作成されたコントローラはクラスとして作成されます。
このクラスはnamespaceによって「App\Http\Controllers」という「名前空間」に配置されてます。

名前空間を使うとクラスをディレクトリ構造のように階層的に分類することが出来ます。

よく見てみるとコントローラが作成されたディレクトリ「app/Http/Controllers」と名前空間「App\Http\Controllers」は一緒な階層構造になっていますが、このフォルダ構成にそって名前空間が指定されていることがわかります。

②:クラスのインポート

use文によって、「Illuminate\Http」の名前空間に配置された「Request」クラスをインポートして使用できる状態にしてます。
コントローラが作成された段階では使用はされてませんが、このクラスは多用することになるのでデフォルトで宣言されています。

③:クラスの定義

作成したコントローラは「app/Http/Controllers/Controller.php」というベースとなるクラスを継承して作成されてます。

アクションを追加してみよう

コントローラで処理する部分を担当するのが「アクション」と呼ばれるものになりますが、クラスのメソッドで実装されます。

では今回作成するアクションは「index」という名前にします。

app/Http/Controllers/HelloWorldController.php
<?php
//...
class HelloWorldController extends Controller
{
    // indexアクション追加
    public function index()
    {
        return '<h1>Hello World</h1>';
    }
}

ルート情報を定義する

アクションを作成した後はWebから上記のコントローラにアクセスできるようにルーティングを設定します。

routes/web.php
// コントローラのindexアクションへのルートを定義
Route::get('/hello-world', 'HelloWorldController@index')

前回の時は第二引数にクロージャを設定していましたが、コントローラを利用する場合は「コントローラ名@アクション名」というようにコントローラ名とアクション名を@で繋げて記述します。

アクセスして表示を確認してみよう

ここまでできたらサーバを起動して実行してみましょう。

# artisanコマンドでサーバ起動 
$ php artisan serve
Laravel development server started: 

起動が完了したら「http://127.0.0.1:8000/hello-world」でブラウザでアクセスしてみてください。

如何でしょうか?

「HelloWolrd」という文字が表示されたかと思います。

他のアクションを追加してみよう

コントローラには複数のアクションを用意することができます。
その場合、どのようにコントローラを実装するのでしょうか?

上記の通り、アクションはクラスのメソッドで表現できました。
ですのでアクションを追加するにはメソッドを追加すれば良いことがわかりますね。

それではコントローラに「index」アクション以外のアクションを追加してみましょう。

app/Http/Controllers/HelloWorldController.php
<?php
//...
class HelloWorldController extends Controller
{
// ...
    public function other()
    {
        return '<h1>Other Page</h1>';
    }
}

アクションを追加した後はルートも定義します!

routes/web.php
//...
Route::get('/hello-world', 'HelloWorldController@index')
// otherアクションへのルートを定義する
Route::get('/hello-world/other', 'HelloWorldController@other');

追加したら「http://localhost:8000/hello-world/other」へアクセスしてみましょう!

追加したアクションの文字が表示されたでしょうか?

このようにページが複数になっても基本的な変わらないです。

シングルアクションコントローラ

Laravelには「一つのコントローラに1つのアクションだけ」という定義もできます。
このような場合、「シングルアクションコントローラ」としてコントローラを用意します。

それでは実際に作ってみましょう。

シングルアクション用のコントローラ作成

まずは新規にコントローラを作成します。

ここでは「SingleActionController」という名前でコントローラを作成します。
※名前は任意なのでお好きな名前をつけてください。ただし後述のルート定義の際はご自身でつけたコントローラ名を記載してください。

# シングルアクションコントローラ作成 
$ php artisan make:controller SingleActionController
Controller created successfully.

クラス編集とルート定義

app/Http/Controllers/HelloWorldController.php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class SingleActionController extends Controller
{
    // PHPのマジックメソッド「__invoke」を使用
    public function __invoke()
    {
        return '<h1>シングルアクションページ</h1>';
    }
}
routes/web.php
//...
Route::get('/hello-world', 'HelloWorldController@index')
Route::get('/hello-world/other', 'HelloWorldController@other');
// ルートを定義する
Route::get('/single-action', 'SingleActionController');

URIに対して「__invokeメソッド」を実装したクラス名を指定すると、Laravelではアクション名(@action)を記述せずとも自動的に「__invoke」メソッドをコールしてくれるため、ルート定義にはコントローラ名だけを記載します。

さいごに

今回、Webアプリケーションフレームワークでは使用されるMVCのControllerについて説明してきましたが、まだまだこれで終わりではありません。

次回はルートパラメータやリクエストパラメータの取得方法について紹介していきたいと思います。

今回は以上となりますが、次回もよろしくお願いいたします。