MVCとは。フレームワークの多くが採用している設計手法の解説
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を利用していきましょう!
ディスカッション
コメント一覧
まだ、コメントがありません