クモのようにコツコツと

フロントエンドエンジニア イイダリョウの技術ブログ。略称「クモコツ」

【Laravel】MVCのコントローラ(C)ことはじめ(3年B組金八先生を表示する!)

Laravelの続きです。前回はルーティングファイルでページ生成、パラメータ読み込みをしました。今回は「MVCアーキテクチャ」の「C」にあたる「コントローラ」を理解する。それではいきましょう!!

【目次】

※前回:【Laravel】ルーティングファイル(routesディレクトリのweb.php)にページを直書きしてみる - クモのようにコツコツと

MVCとは何か

MVCとは何か。Mはモデル(Model)、Vはビュー(View)、C(Controller)はコントローラ。習得中の書籍「Laravel入門」によれば…

  • モデル(Model):データ処理全般を担当。DBにアクセスする処理全般
  • ビュー(View):画面表示を担当。表示に使うテンプレートに相当
  • コントローラ(Controller):全体の制御。必要に応じてMでデータを取得したりVで画面を表示したり

※参考:Laravel入門

今回の主役、コントローラ(C)って文字通り指揮者みたいね。

以前の記事でLaravelのファイル構成を見た時に開いたwelcome.blade.phpというファイル。このファイルがある場所は/resources/views/だった。このviewsはMVCのビュー(V)であると予想。

※参考:Laravelの/publicをルートに変更しHello worldする - クモのようにコツコツと

残るモデル(M)はDB絡みなので今後改めて見ていきたい。

コントローラ(C)を作る

それでは引き続き「Lara入」を参考に進めていく。

まずターミナルを開いてcdコマンドでLaravelのディレクトリに移動。私の場合MAMPなのでこんな感じ

$ cd /Applications/MAMP/htdocs/hoge

laravelのartisanコマンドでコントローラを作ると初期のテンプレート状態になっている。

$ php artisan make:controller HelloController

make:controllerはコントローラを作るコマンド。HelloControllerはコントローラ名。実行すると「成功したよ!」という文字が!

Controller created successfully.

ファイルができたか見てみる。/app/Http/Controllers/ディレクトリを開くとHelloController.phpというファイルができていた!!

HelloController.phpを開いてみるとこんなコードが

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class HelloController extends Controller
{
    //
}
  • 名前空間namespaceApp\Http\Controllersに配置されている。
  • Illuminate\Http\パッケージ内にあるRequestを使える状態に(use文)
  • HelloControllerクラスを定義。Controllerクラスを継承(extends

名前空間てカッコいい名前!範囲は先ほど見にいったディレクトリだ。

名前空間とは、文字通り名前の空間のことで、ここからここまでのコードが○○という空間に属していると定めることができます。 空間が違えば、同じ関数名を定義して使うことができます。

あと、バックスラッシュがでてきた。

名前空間に属する関数を呼ぶときは、○○の名前空間にある関数だよと記述する必要があります。 最初に名前空間名を記述した後に \ (バックスラッシュ)を記述し、その後に関数名を記述します。 バックスラッシュは、円記号で入力できます。

use文とは?

use キーワードを使うことで、名前空間などをインポートしたり、エイリアスを作成することができます。

※参考:【PHP超入門】名前空間(namespace・use)について - Qiita

アクション(処理)を追加

コントローラにアクション(処理)を追加する。

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class HelloController extends Controller
{
// rainenメソッド
public function rainen($nen='何', $kumi='何', $sensei='誰') {

return  <<<EOF
<html>
    <head>
        <meta charset="utf-8"/>
        <title>コントローラ</title>
        <style>
        * {font-family: sans-serif; color: #666;  box-sizing: border-box;}
        section {width: 100%; max-width: 600px; margin: 0 auto; padding: 0 20px; border: 1px solid #ccc;}
        h1 {border-bottom: 1px solid #ccc; padding: 0 0 10px;}
        </style>
    </head>
    <body>
    <section>
        <h1>コントローラ</h1>
        <p>このページはLaravelの「/app/Http/Controllers/」ディレクトリの中の「HelloController.php」の中に書いたrainenクラスを読み込んでいる。</p>
        <p>複数のパラメータを読み込んで表示してみる。</p>
        <p>あなたの来年のクラスは「{$nen}{$kumi}組」、担任は「{$sensei}先生」です!</p>
    </section>
    </body>
</html>
EOF;
}
}
  • HelloControllerクラスの波カッコの中にアクションを書く
  • rainenメソッドを定義。引数は3つで$nen$kumi$sensei。「何」など引数がない場合の代替文字も設定。
  • rainenメソッドの中、ヒアドキュメントEOFを返す。
  • ヒアドキュメントEOFの中のHTMLに{$nen}などの引数のワードが含まれている。

見ての通り、前回の記事と同じような内容です。複数のパスを読み込む設定。

メソッドの頭にあるpublicは「アクセス修飾子」。どこからでもアクセス可能。

※参考:PHPのアクセス修飾子public, protected, privateの違い | UX MILK

なお、ヒアドキュメントEOF;のあとに余計な文字があるとsyntax errorになった。行下げのスペースやタブでもダメみたい。この質問が参考になった。

※参考:PHP - phpで謎の構文エラー|teratail

ルートを割り当てる

アクションを実行するために、ルートを割り当てる。/routesディレクトリのweb.phpを開く。 ルートを追記。

<?php

//コントローラ(rainenクラス)
Route::get('rainen/{nen?}/{kumi?}/{sensei?}', 'HelloController@rainen');

パスrainenHelloControllerrainenクラスを実行。nenkumisenseiのパスを読み込んでページ上に表示してくれるはず。

ルーティングについても前回の記事を参照。今回はコントローラ名、クラス名を指定しているだけで随分すっきり♪

※参考:【Laravel】ルーティングファイル(routesディレクトリのweb.php)にページを直書きしてみる - クモのようにコツコツと

ページを開いてみる(金八先生の表示!)

ちゃんとページが生成されるか開いてみる。ドキドキ…。

※参考:https://vast-meadow-11880.herokuapp.com/rainen

f:id:idr_zz:20190613214901j:plain やた!表示された!!「何」「誰」などもちゃんと表示されている。

パスを追加してみる。/3/B/金八ね。どうか?

※参考:https://vast-meadow-11880.herokuapp.com/rainen/3/B/金八

f:id:idr_zz:20190613214948j:plain やったった!「3年B組金八先生」になった♪

最後に

ということで前回のルーティングの最後の「3年B組金八先生」表示をコントローラで再現しました。それによってルーティングの方は1行のすっきりしたコードになった。コントローラの理解についてはもう少し続ける予定です。それではまた!!