MVCモデルとは?Laravelの構造と合わせて分かりやすく解説

PHP

こんにちは。あっきーです。
webプログラミングやゲームプログラミングをして生きている21歳のニートです。

プログラミングを勉強していると、〇〇モデルというのがやたら出てきます。
Webプログラミング(特にPHP)をしていると、MVCモデルなんて言葉を耳にしませんでしたか?

「MVCモデル?ナニソレ、オイシイノ?」というのが第一の感想だったと思います(僕も含めて)。

このMVCモデルについて今回は超分かりやすく説明していきます。

【注意】MVCモデルは自分から作る必要はあまりないです

ちょっと本題に入る前に、このMVCモデルなんですが、特別自分で設計する必要はありません。
PHPのフレームワークであるLaravelがすでにこの構造を取っているので、Laravelを使っておけば問題ありません。

ただ、いまLaravelを使っている、あるいはこれから使うというときに「Laravelってどんな構造なの?」という疑問が出てくると思うので、そんなときに読んで欲しいと思います。

MVCモデルは役割を3つに分ける構造

MVCモデルというのはWebサイトを動かす際に必要な処理を3つの塊に分けた構造を言います。
その3つというのが名前にある通りで、

  • Model(モデル)
  • View(ビュー)
  • Controller(コントローラー)

となっています。もうちょい説明を加えると

  • Model:データベースに関する処理
  • View(ビュー):ユーザーに実際に見せる画面を作る処理
  • Controller(コントローラー):ユーザーの行動とデータベースをつなぐ処理

という感じです。これだとわかりにくいかもなので、もう少し踏み込みます。

Webサイトの構造って?

そもそも、Webサイトってどうやって動いているかわかりますか?
「Twitterにログインする、検索する、投稿する、画面を表示する、」という処理がどうやって動いているか。
図で表すとこんな感じです。

ユーザーがアクションを起こす
→そのデータを受け取りデータベースに接続
→データベースからデータを受け取る
→そのデータを元に画面を作成
→画面を映す

ざっくりこういう流れです。

そして、図にある通り、Model-View-Controllerという風に役割を分けているんです。
図と先ほどの説明をもう一度照らして確認してください。

  • Model:データベースに関する処理
  • View(ビュー):ユーザーに実際に見せる画面を作る処理
  • Controller(コントローラー):ユーザーの行動とデータベースをつなぐ処理

なぜMVCモデルが使われるのか?

MVCモデルなんですが、Laraevlなど多くのPHPフレームワークで使われています。
ということはそれなりに使うメリットがあるということになるわけですが、そのメリットはずばり、「使いやすい」からです。

PHPのべた書きは後が大変

PHPを始めた頃ってとにかく1つのファイルにすべてをべた書きしていましたよね。(僕もその一人)


<?php

//データベース接続
$host = 'localhost';
$db = 'login';
$user = '';
$pass = '';
$charset = 'utf8mb4';
$dsn = "mysql:host=$host;dbname=$db;charset=$charset";
$options = [
  PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
  PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
  PDO::ATTR_EMULATE_PREPARES => false,
];
$pdo = new PDO($dsn, $user, $pass, $options);

// データベースに送信
$username = $_POST['username'];
$sql = 'SELECT * FROM user WHERE username = ?';
$stmt = $pdo->prepare($sql);
$stmt->execute([$username]);

// データベースからデータを取得
$result = $stmt->fetch();

?>

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>Home
</head>
<body>
<!-- 結果を表示 -->
  <h1>Hello <?= $result['username'] . $result['id'] ?>

</body>
</html>

まだ簡単なプログラムですから良いんですが、もっと複雑に、そしてファイルが増えると後でプログラムを変えたいときに面倒になります。

そこで、これを3つに分けてそれぞれ別のファイルにしておけばその問題が解決します。


<?php

// Model
//データベース接続
$host = 'localhost';
$db = 'login';
$user = '';
$pass = '';
$charset = 'utf8mb4';
$dsn = "mysql:host=$host;dbname=$db;charset=$charset";
$options = [
  PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
  PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
  PDO::ATTR_EMULATE_PREPARES => false,
];
$pdo = new PDO($dsn, $user, $pass, $options);
// Modelここまで

//Controller
// データベースに送信
$username = $_POST['username'];
$sql = 'SELECT * FROM user WHERE username = ?';
$stmt = $pdo->prepare($sql);
$stmt->execute([$username]);

// データベースからデータを取得
$result = $stmt->fetch();
//Controllerここまで 

?>


<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>Home</title>
</head>
<body>
<!-- 結果を表示 -->
  <h1>Hello <?= $result['username'] . $result['id'] ?></h1>

</body>
</html>

それぞれを別々のファイルに分ければ、例えば、「画面のデザインを変えたい」という場合は「Viewのファイル」を変えるだけでOKです。
このように、構造が分かりやすく、メンテナンスもしやすいのでMVCモデルはよく使われます。

PHPのべた書きは実際あまり推奨はされていないので、結局Laravelに頼るにつきます。

Laravelではどういう構造になってる?

MVCモデルについてはある程度理解できたと思います。
で、基本的に自分で1からMVCモデルを考えてプログラムを書く必要はなくて、みんな大好きLaravelさんを使えば気にしなくてOKです。

では、ここからLaravelの構造についてお話します。もちろんMVCモデルも絡んできます。
Laravelのフォルダ構造は以下のようになっています(よく使うフォルダのみ紹介します)。

  • app:Webサイトを動かす中心的なフォルダ
  • database:データベースの設計に使う
  • public:ユーザーがアクセスできる場所。主にCSSなどを置く
  • resources:画面に表示するファイルを置く
  • routes:URLの設定やコントローラーの操作を行う
  • vendor:Composerによりいろんな機能がここにインストールされる(自分では編集しない)

こんな感じです。ひとまずこれくらいを理解しておけばいいです。後は使っているうちに覚えます。

また、appフォルダの中はまたいくつかのフォルダに分かれています。そのうち2つだけ紹介しています(これまた特にお世話になる2つ)

  • Http:Controllerを置く場所
  • Models:Modelを置く場所

appフォルダはartisanコマンド(Laravelで何か機能を作ったり実行するときに使うコマンド)でmakeを使うと勝手にフォルダが追加されます(今は気にしなくてOK)。

見ていただければわかるんですが、しっかりMVCモデルができています。

Laravelではいろんなファイルがありますが、基本はこのMVCモデルに従ってファイルを作っていき、Routesフォルダ内でURLによって処理を指定していくという形をとります。
残りのファイルはこのモデルを成り立たせるための環境づくりだと思ってもらえればOKです(つまり、あまりいじらないこと)。

まとめ

ということで、今回あMVCモデルとLaravelの構造についてざっくり説明しました。
「たくさんファイルがあってLaravelにとっつきにくい!」という感情は取り除ければうれしいです。

おしまい。ではでは。

スポンサードサーチ

オススメ英語学習用SNS "Our Dictionary"

人気記事英語学習用SNSをLaravelで作ってみた【システム解説あり】