MVCwithPHP(二)_PHP

來源:互聯網
上載者:User
關鍵字 這個 function 函數 public 一個
MVC

MVC with PHP(一)中的bug的問題是存在,最大的問題是日誌系統的問題,等完成這這個介紹後我後把全部更正的程式源碼打包
出來,這裡就暫時不做更改了.
先來看看在application.class.php中是如何建立controller執行個體的:

PHP代碼:--------------------------------------------------------------------------------
/**
* 執行函數
*
* 此類唯一對外的一個介面
**/
public function run()
{
$this->parsePath();
$this->checkSecurity($this->module, $this->action);
1. $controller = new $this->controllerClassName();
2. $controller->{$this->action}();
$this->writeLog($this->module, $this->action);
}

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

Application這個類在執行個體後唯一可進行調用的一個函數,它根據使用者的URL請求來分析得出所需要的Controller類名,然後執行個體化這個類(上面標1的地方),再調用從URL中擷取的動作名稱(上面標2的地方),

這個舉一個簡單的例子:
URL: http://localhost/?module=news&action=showList
Application通過分析這個URL重到controllerClassName=news, action=showList,然後它將在包含處理這個controller類的檔案名稱(在Application->getControllerFile()中進行),然後執行個體化News這個
controller類(標1的地方), 隨後調用它的動作showList(標2的地方).
來看看newsController.php中的內容:
=============================================================

PHP代碼:--------------------------------------------------------------------------------

/**
* FileName: newsController.php
* Introduce: 新聞控制類
*
* @author: 大師兄
* @Email: teacherli@163.com
* @version $Id$
* @copyright 2004-10-26
**/
include_once ("./controller/comm/controller.class.php");
include_once ("./model/news/newsModel.php");

class NewsController extends Controller
{
private $model;

/**
* 建構函式
*
**/
public function __construct()
{
parent::__construct();
$this->model = new NewsModel();
$this->setSmartyTemplate_dir("./view/news");
}

/**
* 顯示新聞列表
*
**/
public function showList()
{
1. $newsList = & $this->model->getList();

2. $this->smarty->assign("newsList", $newsList);
3. unset($newsList);

4. $this->smarty->display("newsList.html");
}
}
?>

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

==============================================================
首先,NewsController類繼承自公用類Controller,在類進行初始化時產生一個NewsModel類,這個類是一個model類,由這個類負責新聞模組所有的對資料庫的互動. parent::__construct()調用父類的建構函式,完成對view的控制類Smarty的初始化.$this->setSmartyTemplate_dir("./view/news")將模板目錄定位在./view/news目錄.

然後看我們上面的例子,請求URL為http://localhost/?module=news&actio...List,表示要調用
showList這個動作,看NewsController類的showList()成員函數:
1. $newsList = & $this->model->getList(): $this->model在NewsController初始化時建立,這一句要使用$this->model從資料庫裡提取出一個新聞列表,這個列表當然就是Smarty在操作迴圈塊時需要的二維數組了,在NewsModel類中,它是採用ADODB回傳的一個二維數組.
2. $this->smarty->assign("newsList", $newsList): 熟悉吧,smarty中迴圈塊的程式控制
3. unset($newsList):考慮到效率問題,對於這些臨時變數在使用完成後即時將它unset。
4. $this->smarty->display("newsList.html"):使用smarty來顯示view.

大家看明白了嗎?實際上controller類要做的事情就是這樣:1.調用model從資料庫取出記錄 2.操

作Smarty顯示view。
再來看看NewsController的父類Controller類的源碼:
===========================================================

PHP代碼:--------------------------------------------------------------------------------

/**
* FileName: controller.class.php
* Introduce: Base class of controller
*
* @author: 李曉軍
* @Email: teacherli@163.com
* @version $Id$
* @copyright 2004-10-26
**/

include_once ("./comm/smarty/Smarty.class.php");
include_once ("./comm/config.inc.php");

abstract class Controller
{
private $smarty;

/**
* 系統構建函數
* 初始化Smarty
**/
function __construct()
{
$this ->smarty = new Smarty();

$this->smarty->template_dir = "./view/templates";
$this->smarty->compile_dir = "./view/templates_c";
$this->smarty->cache_dir = "./view/cache";
$this->smarty->cache_lifetime = 60 * 60 * 24;
$this->smarty->caching = false;
$this->smarty->left_delimiter = "<{";
$this->smarty->right_delimiter = "}>";
}

/**
* 設定smarty模板路徑
*
* @param string $template
**/
public function setSmartyTemplate_dir($template)
{
$this->smarty->template_dir = $template;
}

/**
* 設定smarty是否進行緩衝
*
* @param boolean $cache
**/
public function setSmartyCache($cache = false)
{
$this->smarty->cache = $cache;
}

/**
* 設定smarty緩衝時間
*
* @param string $cacheLifetime
**/
public function setSmartyCacheTime($cacheLifetime)
{
$this->smarty->cache_lifetime = $cacheLifetime;
}

/**
* 動作被執行後一個短暫的提示
*
* @param string $module 重新定向到的模組名稱
* @param string $action 重新定向的動作名稱
* @param string $params 參數名稱
* @param string $message 提示資訊
**/
public function redirect($module, $action, $params="", $message="動作已經被成功執

行")
{
$time = WAIT_FOR_TIME;
$params = ("" == $params) ? "" : "&$params";
$URL = "?module=" . $module . "&action=" . $action . $params;

//重新定Smarty模板目錄至公用目錄
$this->setSmartyTemplate_dir("./view/templates");
$this->smarty->assign("URL", $URL); //重新導向的目錄
$this->smarty->assign("message", $message); //提示資訊
$this->smarty->assign("time", $time);
$this->smarty->display("wait.html");
}

/**
* 調用本類不存在的方法時進行的處理
*
* @param string $name
* @param string $parameter
**/
public function __call($name, $parameter)
{
throw new ActionNotAllowException("對不起,你所請求的動作 $name 沒有定義

...
");
}

/**
* 解構函式
*
**/
public function __destruct()
{
unset($this->smarty);
}
}
?>

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

==============================================
Controller是一個抽象類別,也就是說它不可以直接使用new 來產生一個執行個體對象,在類的建構函式裡產生一個Smarty類,並對其進行基本的設定。其它的幾個函數是對Smarty對象進行設定的成員函數, 這裡來看看這兩個函數:

public function redirect($module, $action, $params="", $message="動作已經被成功執行"):
這是一個重新定向成員函數,它的作用是當我們對模組進行一些操作後給出的提示頁面,然後經過設定好的時間自動重新定向到另一個位置,例如我們要對新聞進行一些刪除,刪除成功後我們要給使用者返回這樣一個頁面,告訴使用者操作已經成功,請待n秒後自動返回....這在論壇中是很常見的,這裡我也引用了這樣的策略。

public function __call($name, $parameter):
當類調用類沒有聲明的函數時使用這個函數進行處理,這可是個好東東,有了它,可以使用對程式

的控制更加簡單了,大家可以試試這個方法....

好了,Controller 部分就談到這裡了。
  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.