MVCとは。フレームワークの多くが採用している設計手法の解説

2023年4月14日

MVCとは

プログラムをModel(モデル)、View(ビュー)、Controller(コントローラー)の3つの役割に分けて書くことで、保守性高く、複数人開発しやすい設計手法(アーキテクチャ)。

下記のような新規会員登録画面を例に解説。

上記画面のPHPコード(抜粋)をMVCで分けるとこんな感じ。

//==================== Controller ====================
//POST送信されていた場合
if(!empty($_POST)){
  //変数に入力フォームの値を代入
  $email = $_POST['email'];
  $pass = $_POST['pass'];
  $pass_re = $_POST['pass_re'];
//~~~~~~~~~~~~~~~~~~~~ Model ~~~~~~~~~~~~~~~~~~~~~~~~~
  //未入力チェック
  validRequired($email,'email');
  validRequired($pass,'pass');
  validRequired($pass_re,'pass_re');
  
  //未入力チェックがOKの場合
  if(empty($err_msg)){
    //Emailの形式チェック
    validFormat($email,'email');
    //...各バリデーション

    if(empty($err_msg)){
      //passとpass_reの同値チェック
      validMatch($pass,$pass_re,'pass_re');
      
      if(empty($err_msg)){
        try {
          //DB接続
          $dbh = dbconnect();
          //SQL文作成
          $sql = 'INSERT INTO users(email,password,login_time,create_date) VALUES (:email,:password,:login_time,:create_date)';
          $data = array(
            ':email' => $email,
            ':password' => password_hash($pass,PASSWORD_DEFAULT),
            ':login_time' => date('Y-m-d H:i:s'),
            ':create_date' => date('Y-m-d H:i:s')
          );
          //クエリ実行
          $stmt = queryPost($dbh,$sql,$data);
          
          //クエリ成功の場合
          if($stmt){
            //...最終ログイン日時の設定等
            //マイページへ遷移
            header('Location: mypage.php');
            exit();
          }
        }catch(Exceptoin $e){
          error_log('エラー発生:'.$e->getMessage());
          $err_msg['common'] = 'エラーが発生しました。しばらく待ってから再度お試しください。';
        }
     //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      }
    }
  }
}
//============================================================ ?>

<?php //------------------- View -------------------
$topTitle = 'ユーザー登録';
require('header.php');
 ?>
<main id="main" class="site-width">
  <div class="form-container">
    <h2 class="sub-title">新規登録</h2>
    <div class="explain">
      <p>ユーザーID(E-mail)・パスワードを入力してください。</p>
    </div>
    <form action="" method="post" class="form">
      <div class="area-msg">
        <?php if(!empty($err_msg['common'])){echo $err_msg['common']; } ?>
      </div>
      <label class=" <?php if(!empty($err_msg['email'])){ echo 'err'; } ?>">E-mail<br>
        <input type="text" name="email" value="<?php if(!empty($_POST['email'])){ echo $_POST['email']; }?>"><br>
      </label>
      <div class="area-msg">
        <?php if(!empty($err_msg['email'])){echo $err_msg['email']; } ?>
      </div>
      <!--...各入力項目-->

      <input type="submit" value="登録する" class="submit">
    </form>
  </div>
</main>
<?php
require('footer.php'); 
//------------------------------------------------------------ ?>

MVCでのファイル分割管理

このPHPファイルをModel、View、Controllerの3つのファイルに分けて管理する。

View

<html>
  <head>
    <meta charset="utf-8">
    ...
  </head>
  <body>
    <header></header>
    <main>
    <?php echo $email; ?>
    ...
    </main>
    <footer></footer>
  </body>
</html>

画面に表示するための処理。HTMLで記述された部分や、画面に表示するために書かれたPHPのコードも。

Controller

<?php
if(!empty($_POST)){
  //変数に入力フォームの値を代入
  $email = $_POST['email'];
  $pass = $_POST['pass'];
  
 //モデルを呼び、DBに値を渡す
  //または、モデルから値を貰う
  //モデルから貰った値をビューに渡して表示する
  ...
?>

View(ユーザー)やModel(DB)から値を受け取ったり、値を渡したりする処理。ViewとModelの橋渡し役。

Model

try {
  //DB接続
   $dbh = dbconnect();
     //SQL文作成
     $sql = 'INSERT INTO users(email,password,login_time,create_date) VALUES (:email,:password,:login_time,:create_date)';
     $data = array(
       ':email' => $email,
       ':password' => password_hash($pass,PASSWORD_DEFAULT),
       ':login_time' => date('Y-m-d H:i:s'),
       ':create_date' => date('Y-m-d H:i:s')
     );
     //クエリ実行
     $stmt = queryPost($dbh,$sql,$data);
     ...

DB(データベース)へ接続する処理。レコードを挿入したり、更新したり、削除したり。

MVCモデルの処理の流れ

まとめ

MVCを利用し、役割ごとにソースコードを分けることによって、ソースコードの可読性が上がり、開発、保守作業が効率化されます。また、ソースコードの変更時にバグが発生しても、他のファイルへの影響はほとんどなく、修正も容易になります。

効率的な作業や、後々メンテしやすいソースコードを目指して、MVCを利用していきましょう!

手法・技法

Posted by num33