MVCモデルとLaravelフレームワーク
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 というファイルが生成されます。
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