亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > PHP > 正文

PHP的MVC模式實現原理分析(一相簡單的MVC框架范例)

2024-05-04 23:23:10
字體:
來源:轉載
供稿:網友

他們的工作原理大家應該也比較感興趣,下面我說說一個mvc框架長什么樣。

路由機制

在互聯網我們都是通過url提供服務,因此不同的url有不同的服務。用戶訪問不同的頁面也就獲得了不同的服務。那么我們的服務是如何通過url來區分不同的服務呢。

我們的web程序就要通過url尋找到不同的文件,進行不同的業務邏輯處理。我們的路由機制就是根據url,尋找到對應的controller,和action,然后由action進行具體的業務邏輯處理。

一個簡單的controller

復制代碼 代碼如下:


//定義一個controller
class UserControler extends Controller{
     //定義一個action方法,注意一定是public的
     public function index(){
          // do business code
     }
}

具體的對應規則不同的框架映射不同。以下是CodeIgniter框架的URL路由,它會盡力的嘗試各種的可能,來分析URL的情況。

文件路徑/system/core/URI.php

復制代碼 代碼如下:


// 看看是否是從命令行運行的
if (php_sapi_name() == 'cli' or defined('STDIN')){
    $this->_set_uri_string($this->_parse_cli_args());
    return;
}

// 首先嘗試 REQUEST_URI 這個適應大部分的情況
if ($uri = $this->_detect_uri()){
    $this->_set_uri_string($uri);
    return;
}

// 看看PATH_INFO變量是否存在?nginx需要配置
// Note: some servers seem to have trouble with getenv() so we'll test it two ways
$path = (isset($_SERVER['PATH_INFO'])) ? $_SERVER['PATH_INFO'] : @getenv('PATH_INFO');
if (trim($path, 'http://www.49028c.com/') != '' && $path != "http://www.49028c.com/".SELF){
    $this->_set_uri_string($path);
    return;
}

// 沒有PATH_INFO,看看 QUERY_STRING?
$path =  (isset($_SERVER['QUERY_STRING'])) ? $_SERVER['QUERY_STRING'] : @getenv('QUERY_STRING');
if (trim($path, 'http://www.49028c.com/') != ''){
    $this->_set_uri_string($path);
    return;
}

//嘗試去從 $_GET 獲取信息
if (is_array($_GET) && count($_GET) == 1 && trim(key($_GET), 'http://www.49028c.com/') != ''){
    $this->_set_uri_string(key($_GET));
    return;
}

// 盡力了,放棄了路由
$this->uri_string = '';
return;

通過上面的嘗試,接下來就是如何利用路由機制加載正確的controller了。

Controller加載機制

我們來看看Codeigniter框架是如何加載到controller并且調用action的。

在/system/core/Codeigniter.php中有如下的代碼。Codeigniter在這之前會根據$_SERVER['PATH_INFO]里面的值來進行賦值(這個都是靠自己的設定的,默認的話CI他會有許多的if分支進行判斷)。

復制代碼 代碼如下:


//大約在250行
include(APPPATH.'controllers/'.$RTR->fetch_directory().$RTR->fetch_class().'.php');

$class  = $RTR->fetch_class();
$method = $RTR->fetch_method();

//大約在308行
$CI = new $class();

//大約在359行
call_user_func_array(array(&$CI, $method), array_slice($URI->rsegments, 2));

就這樣,通過這個就調用到了我們的controller及其方法了,接下來就是編寫自己的業務邏輯代碼了。


視圖view的顯示

當我們的業務邏輯代碼寫完后,就需要頁面的展示了。很多常見的MVC框架在頁面的調用是這么寫的。

復制代碼 代碼如下:

//controller中action的方法
public function index(){
    // ... 許多的業務邏輯代碼
    $data = array('name'=>'abc', 'age'=>12, .... );
    return $this->render('view/path/file.html',$data);
}


接著在視圖文件view/path/file.html里寫上一下代碼。

復制代碼 代碼如下:

<div>
姓名 : <?=$name ?>
年齡 : <?php echo $age; ?>
</div>


這段如何將數據渲染到視圖中,這段代碼以前我一直很好奇,現在我明白了,我們來看看是如何實現的。

復制代碼 代碼如下:

protected function render($template, array $var = array() )
{
    extract($var);   // 抽取數組中的變量
    ob_end_clean (); //關閉頂層的輸出緩沖區內容
    ob_start ();     // 開始一個新的緩沖區
    require TEMPLATE_ROOT . $template . '.html';  //加載視圖view
    $content = ob_get_contents ();             // 獲得緩沖區的內容
    ob_end_clean ();           // 關閉緩沖區

    //ob_end_flush();      // 這個是直接輸出緩沖區的內容了,不用再次緩存起來。
    ob_start();            //開始新的緩沖區,給后面的程序用
    return $content;       // 返回文本,此處也可以字節echo出來,并結束代碼。
}

在這短短的幾行代碼中,全都是精華,就是這些非常重要的,全是php的內置函數,接下來我們來具體分析分析。

看看第一個extract($var)。這個函數從數組中將變量導入到當前的符號表。剛剛就將$data數組里面的name、age抽取出來,這樣就可以在視圖view中使用$name $age。更詳細的請參考

第二個ob_end_clean()的作用是關閉頂層的緩沖區,為了是之前的程序不小心echo出的一些文字給清楚了,為了下一行的重新開辟一塊緩沖區。

第三個ob_start()是開啟一塊新的緩沖區,為了是將視圖的內容放到緩沖區。當然了,緩沖區有一定的大小,如果內容超出了緩沖區的設定值,那么會自動的發送給server。

第四個require file,這個就是第一個參數,根據自己的規則去加載視圖的文件。其中文件里可以夾雜php、html的代碼。你在這個render()函數聲明的任何局部變量或者這里能訪問到的任何全局變量,都可以在require的file文件中訪問到。

第五個$content = ob_get_contents ()很重要,是為了將緩沖區的內容取出來,但不清除它。

第七個ob_start()是重新開啟一個緩沖區,為了是下面的程序需要使用緩沖區。有寫框架可能不用對$content的內容進行操作了,那么直接ob_end_flush()將緩沖區的內容輸出出來就行了。

這個是一個很簡單的展示視圖的過程。如果直接使用這個不方便對視圖view進行模塊化,因此一些框架都不會這么直接用的。

我們從這個函數也可以看到程序有點類似程序中斷保護現場的感覺。只不過中斷保護現場會先保存數據,然后在返回的時候恢復回來。這里只有關閉上一個緩沖區,開啟一個新的緩沖區,關閉這個緩沖哦過去,開啟另外一個緩沖區。

至此,我們看到一個簡單的PHP的MVC框架。如果你有興趣可以自己開發一個MVC框架,或者更深入點的HMVC。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲视频网站在线观看| 亚洲一区二区久久久| 国产日韩欧美自拍| 亚洲精品美女在线| 最近中文字幕日韩精品| 亚洲四色影视在线观看| 热久久视久久精品18亚洲精品| 日韩成人中文电影| 97在线视频一区| 清纯唯美亚洲综合| 黄网站色欧美视频| 精品国产欧美一区二区五十路| 国产精品爱久久久久久久| 91视频免费在线| 亚洲欧美综合v| 国产亚洲欧美另类中文| 不卡毛片在线看| 久久人人看视频| 色yeye香蕉凹凸一区二区av| 久久精品一本久久99精品| 国产精品99久久久久久久久| 亚洲精品中文字| 欧美三级欧美成人高清www| 亚洲成人中文字幕| 91精品国产高清久久久久久久久| 日韩国产高清视频在线| 亚洲成年网站在线观看| 欧美乱大交xxxxx另类电影| 2019中文字幕全在线观看| 国产精品爱久久久久久久| 亚洲日韩欧美视频| 久久久精品国产| 亚洲xxxx在线| 超薄丝袜一区二区| 日本成人在线视频网址| 久久影院资源网| 91av在线免费观看视频| 亚洲片国产一区一级在线观看| 91精品久久久久久综合乱菊| 青青久久av北条麻妃黑人| 日韩av综合中文字幕| 欧美日韩国产综合新一区| 综合国产在线视频| 91在线视频九色| 欧美日韩成人精品| 在线观看中文字幕亚洲| 亚洲色图国产精品| 日本在线精品视频| 2019国产精品自在线拍国产不卡| 国产精品27p| 中文字幕日韩欧美精品在线观看| 亚洲一区二区三区sesese| 亚洲视频在线观看视频| 九色精品美女在线| 日韩在线观看av| 欧美成人精品一区二区三区| 另类少妇人与禽zozz0性伦| 精品久久久久久| 亚洲第一天堂无码专区| 91精品国产91久久久久久久久| 日韩hd视频在线观看| 国产a∨精品一区二区三区不卡| 欧美第一淫aaasss性| 日韩欧美第一页| 一区国产精品视频| 自拍偷拍亚洲精品| 91欧美精品成人综合在线观看| 欧美一级电影久久| 91精品视频网站| 亚洲国产精品久久久久秋霞不卡| 色吧影院999| 日韩风俗一区 二区| 日本国产一区二区三区| 国产一区二区三区18| 国产日本欧美视频| 亚洲成人在线网| 在线播放精品一区二区三区| 富二代精品短视频| 国产欧美精品在线播放| 国产一区二区三区三区在线观看| 成人写真福利网| 久久国产精品久久久久久| 成人免费视频网址| 亚洲a区在线视频| 成人免费视频a| 久久久久久国产精品三级玉女聊斋| 成人黄色片网站| 日韩高清免费观看| 日本一区二区三区四区视频| 欧美日韩亚洲精品内裤| 色偷偷噜噜噜亚洲男人的天堂| 深夜成人在线观看| 欧美午夜视频在线观看| 韩剧1988免费观看全集| 色www亚洲国产张柏芝| 黑人极品videos精品欧美裸| 555www成人网| 亚洲日本中文字幕| 欧美一性一乱一交一视频| 久久在线视频在线| 中文字幕日韩在线视频| 亚洲视频专区在线| 成人激情在线观看| 亚洲欧美日韩一区二区在线| 97超碰国产精品女人人人爽| 国产精品成人久久久久| 欧美一级成年大片在线观看| 久久久久久久久久久成人| 久久久久久伊人| 久久夜精品香蕉| 久久人人爽亚洲精品天堂| 日韩欧中文字幕| 久久人人爽人人| 有码中文亚洲精品| 中国人与牲禽动交精品| 国产自产女人91一区在线观看| 色多多国产成人永久免费网站| 九九视频这里只有精品| 精品亚洲国产视频| 国产精品女人久久久久久| 日韩大陆毛片av| 国产精品女人久久久久久| 国产aⅴ夜夜欢一区二区三区| 欧美丰满少妇xxxx| 欧美一区视频在线| 亚洲欧美在线一区| 91久久在线观看| 国产欧美精品日韩| 日韩在线视频播放| 中文字幕综合在线| 久久精品国产精品| 欧美另类第一页| 欧美高清在线视频观看不卡| 欧洲成人午夜免费大片| 亚洲第一视频网| 久久精品91久久久久久再现| 欧美日韩在线第一页| 日韩大片免费观看视频播放| 精品国内产的精品视频在线观看| 国产精品第一页在线| 亚洲免费视频观看| 久久久国产视频91| 欧美在线国产精品| 91免费看片网站| 亚洲欧美日韩中文视频| 亚洲国产日韩欧美综合久久| 日本高清不卡的在线| 亚洲精品影视在线观看| 日韩精品久久久久久久玫瑰园| 色综合色综合久久综合频道88| 国产精品视频xxx| 正在播放欧美视频| 欧美激情一区二区久久久| 日韩69视频在线观看| 亚洲欧洲一区二区三区久久| 日韩成人在线视频| 亚洲女人初尝黑人巨大| 97国产在线观看| 国产网站欧美日韩免费精品在线观看| 久久久久久成人精品| 亚洲大尺度美女在线| 欧美久久精品午夜青青大伊人| 欧美丰满少妇xxxxx| 精品国产一区二区三区久久|