Re: [請益] MVC的問題

看板PHP作者 (請勿忘記密碼)時間17年前 (2008/11/02 01:57), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串3/3 (看更多)
※ 引述《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
文章代碼(AID): #1939YVbP (PHP)
討論串 (同標題文章)
本文引述了以下文章的的內容:
0
6
完整討論串 (本文為第 3 之 3 篇):
0
6
文章代碼(AID): #1939YVbP (PHP)