2000年2月13日星期日

MVCサンプル

最小限のMVCのサンプル

Java/Servletではforwardというのがあるが、PHPではforwardはできないので、controller.phpがview.phpをインクルードすることによってビューにデータを渡す。

---------------------------------------------------------------------------------------------------------------------------------------------------------

controller.php

<?php
// コントローラ
// ユーザが最初にアクセスするphp。
// index.phpという名前にしてもよい。
require_once("model.php");

session_start();

function redirect($pagename) { 
    if (headers_sent()) {
        exit("Error: redirect: Already header has sent!");
    }

    $host  = $_SERVER['HTTP_HOST'];
    $uri   = rtrim(dirname($_SERVER['PHP_SELF']), '/\\');
    header("Location: http://$host$uri/$pagename");
    exit;
}

// action は必ず GET で渡す。
// POST を一切使いたくない画面もあるから。
if (array_key_exists("action", $_GET))
    $action = $_GET["action"];
else
    $action = "";

switch ($action) {
case "":
    require_once("view.php");       // 初期表示表示
    break;

case "dbaccess":
    $result   = dbaccess();

    $nextpage = $result[0];
    $_SESSION["data"] = $result[1]; // ビューに渡すデータ

    switch ($nextpage) {
    case "success":
        redirect("success.php");    // 成功画面表示
        break;

    case "failure":
        redirect("failure.php");    // 失敗画面表示
        break;
    }
    break;

default:
    echo "action の値が変です: [{$action}]";
    break;
}
?>
---------------------------------------------------------------------------------------------------------------------------------------------------------

model.php

<?php
function dbaccess() {
    // コントローラに返すデータを初期化
    $result = array("", array());

    // パラメータの取得はコントローラでなくモデルの中でやった方がいいと思う。
    $t1 = $_POST["t1"]; 

    if ($t1 == "hoge") {
        $result[0] = "success";
    }
    else {
        $result[1]["msg"] = "よくわからないエラー";  // ビューに渡すデータ
        $result[0] = "failure";
    }
    return $result;
}
?>
---------------------------------------------------------------------------------------------------------------------------------------------------------

view.php

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<h1>view.php</h1>

下のテキストボックスに「hoge」と入力した場合だけ成功します。<br>
<form name="f1" action="controller.php?action=dbaccess" method="POST">
<input type="text" id="t1" name="t1" maxlength=10><br>
<input type="submit" value="送信">
</form>

</body>
</html>
---------------------------------------------------------------------------------------------------------------------------------------------------------

success.php

成功画面。
実際は成功した場合の遷移先もこんな単純ではないだろうから、MVCにしてsuccess.phpをコントローラにするとよい。

<html>
<head>
<meta content="text/html"; charset="utf-8">
</head>
<body>
成功です!
</body>
</html>
---------------------------------------------------------------------------------------------------------------------------------------------------------

failure.php

失敗画面

<?php
    if (!isset($msg))
        $msg = "";
?>
<html>
<body>
失敗です!<br>
原因:<?php echo $msg;?><br>
<input type="button" value="戻る" onclick="history.back();"><br>
</body>
</html>
---------------------------------------------------------------------------------------------------------------------------------------------------------

没有评论:

发表评论