🌊

MVCモデルとLaravelフレームワーク

2023/09/19に公開

MVCモデルとは

MVCモデルとは、プログラムの処理をModel(モデル)・View(ビュー)・Controller(コントローラー)に分けて設計するソフトウェア開発における設計モデルのことです。

MVC 説明
Model システムのビジネスロジック部。データベース操作をプログラムで扱いやすいインタフェースとして提供
View ブラウザに表示する画面のレイアウトや操作を動的に生成
Controller 画面操作などからくるリクエストに対してデータ処理を行い表示を指示する

Laravelフレームワーク

LaravelにおいてもこのMVCモデルを採用しています。そしてこのMVCモデルへの呼び出し方を定義するのが「Routing(ルーティング)」になります。

処理の流れに従った順で「MVC+Routeing」の処理を記載すると下表のようになります。

MVC Laravelにおける役割
Routing ブラウザ・HTMLの<a>タグのhref・formのactionからControllerにアクセスするためのインタフェースを提供する。またapiを提供する。
Controller Routerからのリクエストに対して、必要なデータベース処理を行い、画面表示が必要な場合はViewに表示を指示する。
Model データベースのリレーションを保持し、Controllerにデータベース処理をクラス・メソッドとして提供する。
View Controllerが準備したデータを受け取り、画面を動的に生成する。

1. Routing

Route::get[/post](‘path’, ‘Controller名@Method名’)->name('名前');

上記が書式になります。意味は以下の通りです。

記述例 意味
path ブラウザから呼び出す時のpath
Controller名 呼び出すコントローラ名
Method名 コントローラのメソッド
名前 Viewから呼び出す時の名前

以下に具体例を見てみましょう。

(1) 引数なし呼び出し

[例1] Route::get('/', 'UserController@index')->name('top');

localhostに対する呼び出し方は下表のようになります。

呼出方法 記載方法
url指定 https://localhost/
名前指定 route('top')

(2) 引数あり呼び出し

[例2] Route::get('user/{id}', 'UserController@index')->name('user');

こちらは、引数idを渡す時の呼び出し方です。

呼出方法 記載方法
url指定 https://localhost/user/id
名前指定 route('user', $id)

2. Controller

Routerから呼び出されるコントローラを作成し、メソッドを定義していきます。

(1) コントローラを作成

Dockerに入り、Terminalから以下のコマンドを打つことでコントローラが生成されます。

$ php artisan make:controller <<コントローラ名>> 

具体的には、

$ php artisan make:controller UsersController
と打つと、app/Http/Controllers/UsersController.php というファイルが生成されます。

UsersController.php
class UsersController extends Controller
{
    //
}

この中にメソッドを定義すれば、ルーターからのリクエストを受け取ることができるようになります。

(2) リクエストの受取り方法

① 引数なし呼び出し

「1(1) 引数なし呼び出し」からのリクエストを受け取るメソッドは以下のようになります。

public function index()
{
    //
    return view('welcome');
}

上記のindexメソッドでは、Viewの'welcome'を呼び出した応答をルータに返却します。
※Viewについては後述します。

② 引数あり呼び出し

「1(2) 引数あり呼び出し」からのリクエストを受け取るメソッドは以下のようになります。

public function create($id)
{
    // Routing から$idを受け取る
    $user = User::findOrFail($id);
    // Modelから必要なデータを取得して
    // Viewで画面を生成する処理を書く
}

③ フォーム actionからのリクエスト

フォーム actionからRoutingの名前を指定してControllerにリクエストを投げることができます。フォームactionの場合は、フォームで入力された情報が一緒に送られてきます。またフォームの情報に加えて、引数を付けてリクエストを投げることができます。

<form method="POST" action="{{ route('users.store', $user_id }}">
    <label for="email">メールアドレス</label>
    <input class="form-control" name="email">
    <label for="password">パスワード</label>
    <input class="form-control" type="password" name="password" >
    <button type="submit" class="btn btn-primary">更新する</button>
</form>

上記の例ではactionに{{ route('users.store', $user_id }}と書くことで、フォームの入力にuser_idを引数に加えて'users.store'にPOSTしています。'users.sotre'と名前付けされているRoutingを経由して、指定のControllerにリクエストが送信されます。

public function create(Request $request, $id)
{
    // フォームに入力された情報は$requestとして渡されます。
    $emai = $request->email;
    $password = $request->password;
    $user = User::findOrFail($id);
    // データベースにデータを登録する時などに使われます。
    return back();  // 元の画面を表示させる
}

(3) Viewの呼び出し

Viewの呼び出しは、Controllerから以下のような形で呼び出します。

return view('welcome', $data);

このように記述することで、'welcome'というViewを呼び出して$dataを渡すことができます。
ここで注意すべきことは、$dataは連想配列で記述するということですが。

$data = [
   'user_id' => $id,
   'email' => $email_address
];

とすることで、Viewの中では、''で囲まれた名前の変数として使用することができます。
つまり上記の例であれば、Viewの中で$user_id, $emailと記述することで、コントローラから渡された $id, $email_addressを使用できるようになります。

またObjectも渡すことができます。

$users = User::orderBy('id', 'desc')->get();
return view('welcome', [ 'users' => $users);

と記述することで、Userモデルから取得した複数のユーザ情報をViewに渡すことができます。

3. View

Controllerからの表示要求に応じて、HTMLファイルを動的に生成する機能を提供します。
Viewでは、画面ごとにHTMLコードを予め記述したテンプレートを用意しておき、そこにControllerからデータを与えると、テンプレートエンジン(Blade)がテンプレートとデータを統合してHTMLレスポンスを生成してくれます。

4. Model

各データベースのテーブルに対してModelを作成することで、データベースとのやり取りをクラス・メソッドとして提供してくれます。またテーブル間のリレーションに関する定義を行うことで、1対多、多対多のテーブル間のデータ参照を容易にしてくれます。
それぞれのテーブルに用意されたModelを使うことで、Controllerは通常のクラスを使用する感覚で、データベースアクセスを実装することができます。


View, Modelは簡単な説明だけになってしまいましたが、また時間ができたら記載していきたいと思います。本ページは、LaravelでRouter → Controller → View を使用するに当たって、それぞれの呼び出し方とデータの受け渡しの仕組みがわかるように解説したつもりです。

Discussion