Laravelの制御部分、コントローラの役割と作成の方法

 

LaravelのようなMVCと呼ばれるフレームワークでは、表示部分と処理部分を分けて書くように設計されており、その2つの仲介役的な役割をコントローラが担います。

 

前回ルーティングのやり方について書きましたので、当記事ではコントローラの作り方について書いていきたいと思います。

 

前回のルーティングについての記事は以下から参照できます。

関連記事

  Laravelでプログラムを書き進めていくにあたって必須になってくるのがルーティングという仕組みです。これを理解していないとウェブページに画面を出力することができません。 今回はそんな、Laravelを始めて最初に[…]

Laravelのルーティングについて

 

コントローラの役割

 

いきなりコントローラといってもなんだそれはという感じなので、まずは、Laravel含むMVCというパターンについて理解する必要があります。

 

MVCフレームワークでは大きく3つの部品に分けることができます。

モデル(M) ビジネスロジックな処理を行っている部分
ビュー(V) 画面表示を担当している部分
コントローラ(C) モデルとビューの橋渡し役としてプログラム全体での制御を担当する部分

MVCについて参考にさせていただいた記事:https://qiita.com/gcyata/items/772b6989f4cdab0bd047

 

表の通り、コントローラの役割としては、モデルとビューの橋渡し役になります。

簡単にいうと、モデルにデータを受け渡し、受け取ったりして、ビューに渡すデータを作り上げ、ビューにデータを渡すといった感じにアプリケーションを制御する役割を持っています。

 

さて、コントローラの役割を見たところで、実際にコントローラを作成する手順を見てみましょう。

 

コントローラのフォーマット作成

 

Laravelにはコントローラのフォーマットを簡単に作成できる機能が備わっています。

Windowsならコマンドプロンプトから、Mac,Linuxならターミナルからコマンドを打つだけで作成できてしまいます。

 

まず、コマンドプロンプトまたはターミナルでLaravelのファイルがインストールされているフォルダのトップに移動しましょう。

$ cd path/to/laravel

 

そこで以下コマンドを以下コマンドを打ち込んでみます。

$ php artisan make:controller SampleController

# php artisan make:controller コントローラの名前

 

コントローラの名前はクラス名にもなるので、大文字からはじめてOOControllerとなるようにします

 

このコマンドを実行したことにより、新たなファイルが作られているはずです。場所はapp/Http/Controllers/SampleController.phpとなっているはずです。

 

作られたSampleController.phpを開いてみると、SampleControllerクラスのフォーマットが作られていて中は何もない状態になっていると思います。

<?php
namespace App\Http\Controllers; 
//名前空間を定義、基本的にフォルダ構造と同じになるはず

use Illuminate\Http\Request; 
//リクエストに関する処理を使えるようにしてます

class SampleController extends Controller //クラスが作られていて中は何もない
{
    //
}

 

このフォーマットを利用して必要な処理をメソッドとして追加してしていきます

 

ちなみにスペルミスなどで間違えてファイルを作ってしまった場合には作ったファイルを消してもう一回コマンドで作り直せば大丈夫です。

 

メソッドを追加してみる

 

では、試しにコントローラにメソッドを追加してみたいと思います。indexというアクションを追加してみます。

class SampleController extends Controller
{
    public function index () {
        $html = '<html><body><h1>Hello World</h1></body></html>';
        return $html;
    });
}

今回は簡単にindexというメソッドにはHTMLを文字列として返す処理を書いてみました。

 

ルーティングから呼び出す

 

では、どうやってルーティングからコントローラを呼び出すのかということが気になります。

 

ブラウザからのURLとファイルの呼び出しはroutes/web.phpが行っていました。これにコントローラを呼び出す処理を書いてみましょう。

Route::get('sample', 'SampleController@index');

 

コントローラを呼び出すときの文法は第二引数に文字列で「コントローラ名@メソッド名」と指定してあげるだけです。

これで、「/sample」にアクセスすると、先ほど書いたSampleControllerクラスの中のindexメソッドの中の$htmlがHTMLとして読み込まれて表示されると思います。

 

URL設計の例として、URLとコントローラに統一した命名をすることもあるようです。

例:http://ドメイン/コントローラ名/メソッド名

 

URLのパラメータも渡せる

 

URLに入力されているパラメーターもコントローラに引き渡すことができます。つまり「/sample/OO」とアクセスしたときにOOが変数として扱えるということです。

 

まず、ルーティングの部分は以下のようにします。

Route::get('sample/{msg?}', 'SampleController@index');

 

これで第一引数にある{msg}の部分がパラメータとして扱われるようになります。また「?」を付けることによってパラメータが入力がなされなかったときにもエラーが出なくなります。

 

コントローラの部分は以下の通りになります。

class SampleController extends Controller
{
    public function index ($msg = 'no msg') {
        $html = '<html><body><h1>'.$msg.'</h1></body></html>';
        return $html;
    });
}

 

indexには$msgという引数が与えられてます。これは、先ほど指定したパラメータをindexの中で使えるようにするために書いています。

試しに「/sample/hello」でアクセスするとhelloが表示されるかと思います。

 

まとめ

 

Laravelでコントローラの作り方とルーティングからの呼び出し方についてわかりました。今回の流れをまとめると以下の感じになります。

 

  • コントローラはコマンドでフォーマットが作成可能
  • できたフォーマットにメソッドを追加する
  • ルーティングから呼び出す

 

実際にはここに処理を記述していき、モデルやビューと連携しながらアプリケーションを作っていきます。

Laravelのビューを担うBladeについての記事もよかったら目を通していっていただけると嬉しいです。

関連記事

  通常PHPで開発するときには表示部分をHTMLで記述しますが、LaravelにはBladeテンプレートという便利なものが用意されています。 Bladeテンプレートでは普通にPHPやHTMLで書のではできない便利な機[…]

LaravelのBladeテンプレートの構文について

 

 

最後に…   Laravelを勉強し始めでもっと勉強したいなら以下の本がおすすめです。