Re: [請益] MVC的問題
※ 引述《askq (ask)》之銘言:
: 爬過板上的文章也請教過google大師了
: 不過通常都是架構
: 除了架構之外還是一頭霧水
: 不知道model , view , controler裡面的code要如何寫才符合
: 所以希望版友能給個簡單的範例
: 類似像留言板的mvc架構要如何寫
: 我寫的是在controller裡面寫個表單
controller裡面不會出現HTML,view裡面才會有。
: 如:
: <form method="post" action="model.php">
: <textarea name="message"></textarea>
: <input type="text" name="author" />
: <input type="submit" />
: <input type="reset" />
: </form>
: 而model.php則是:
: $message = $_POST['message'];
: $author = $_POST['author'];
: 再將$message和$author利用表單傳給view.php
: 而view.php在echo出來
: 不過感覺好像又不是這樣...
: 只覺得中間多一層controller而已
: 希望有板友可以幫我解答一下
: 先謝謝了~~
舉個簡單的例子:
controller.php:
require_once('model.php');
require_once('view.php');
$view = new View();
if($_SERVER['REQUEST_METHOD'] == 'POST') {
// 有接收到POST資料
// 檢查資料格式。
// 有時候也會把檢查資料格式正確性的工作交給model。
// 這時候model要提供相關功能做這件事,controller
// 把收到的資料依照model預期的格式傳送過去,model
// 再把檢查結果告訴controller,controller依照這結果
// 決定下一步要怎麼走。
$input_errors = array();
if(!isset($_POST['author'] || strlen($_POST['author']) > 20) {
$input_errors['author'] = true;
}
if(!isset($_POST['message'] || strlen($_POST['message'] > 255) {
$input_errors['message'] = true;
}
if(!empty($input_errors)) {
// 資料格式有問題
// 將錯誤相關資料傳送給view並且重新顯示表單畫面。
// form.html應該要根據收到的錯誤資訊去顯示適當的畫面。
$view->assign('input_errors', $input_errors);
$view->display('tpl_form.php');
exit;
}
// 資料格式沒問題,將接收到的資料傳給model處理並取回結果。
// controller本身要知道model預期接收的資料格式,以及model
// 會回傳的各種結果分別代表什麼意義。
$model = new MyModel();
$result = $model->save_message($_POST);
if($result == true) {
// 儲存成功,顯示感謝畫面。
$view->display('tpl_thanks.php');
// 有時候也會用重新導向的方式去顯示感謝畫面,這樣可以避免
// reload畫面時重複送出資料。
// header('location:controller.php?thanks');
exit;
}
// 儲存失敗,將儲存結果傳給view,並且重新顯示tpl_form.php。
// tpl_form.php應該要知道當有這個error的時候,要顯示什麼在畫面上。
// 注意view本身並不知道model回傳什麼東西,view所接收到的資訊
// 都是由controller告訴他的。
$view->assign('error', $result);
$view->display('form.html');
exit;
} // if
// 沒有接收到POST資料,如果有接收到$_GET['thanks']這個參數,
// 就顯示感謝頁,否則就顯示表單畫面。
if(isset($_GET['thanks'])) {
$view->display('tpl_thanks.php');
}
else {
$view->display('tpl_form.php');
}
model.php:
model裡面不會有HTML,甚至也不會直接存取$_GET, $_POST資料。
class MyModel {
function save_message($data) {
// 資料都在$data這個陣列裡面,
// model負責去連接資料庫,將資料存入,發送通知信件等等工作。
return true;
}
}
view.php:
可以自己寫一個簡單的View class,也可以直接使用例如Smarty這類
函式庫來當做View。
自己寫的話...
class View {
function assign($var, $value) {
}
function display($template) {
}
}
用Smarty的話...
require_once('lib/smarty/libs/Smarty.class.php');
class View extends Smarty {
function View() {
parent::Smarty();
// 做一些Smarty需要的設定
$this->tepmlate_dir = '......';
$this->compile_dir = '........';
}
// 此後就直接利用Smarty提供的所有功能吧
}
tpl_form.php
樣板檔案,這裡面才會出現HTML。這裡直接使用php程式來當成樣板檔案
(假設不用Smarty的話)。view裡面還是會有一些程式邏輯,但是務必要
保持簡單,不要在view裡面去處理複雜的流程或者資料結構等等。
表單資料是傳送給controller去接收。
<?php if($isset($input_errors')): //接收到view傳來的錯誤資訊... ?>
<p>您的資料有以下錯誤:</p>
.............
<?php endif; ?>
<form action="controller.php" method="post">
........
</form>
以上大概可以看一下model/view/controller的使用方式以及他們之間的關聯。
這只是一個很簡單粗淺的例子,你也可以參考各php framework的作法。
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 122.116.64.235
討論串 (同標題文章)
PHP 近期熱門文章
PTT數位生活區 即時熱門文章