架構這個概念可能一開始就嚇壞了很多PHP的Coder,其實你只要把一個Framework想明白了,其實也沒啥,只是別人功能更複雜,細節考慮的更多,代碼品質更高。
架構最重要的一個檔案為入口檔案,基本上相當於一個總控開關,所有的請求都需要經過這個檔案:
2 |
define('APP_PATH',dirname(__FILE__).'/..'); //應用路徑 |
3 |
include APP_PATH.'/Library/Toper/Core/FrontController.class.php';//匯入前端控制器 |
4 |
$frontController = Tp_FrontController::getInstance(); |
5 |
$frontController->run(); |
這個檔案可以只做一件事情,那就是將控制權交給架構。
大家都知道,一個MVC的應用,所有的請求都必須經過控制器,所以下面我們來編寫一個比較簡單的控制器:
2 |
class Test_IndexController extends Tp_Controller { |
3 |
public function indexAction() { |
這個類只需要繼承自Tp_Controller即可,Tp_Controller是Toper的控制器的基類,只要你繼承它,你就可以使用架構幫你寫好的一系列方法,這樣就可以大大減少你自己的工作量了,並且按照規範,函數名也是有意義的,如剛才寫的這個函數代表的意義就是訪問Test模組IndexContrller這個控制器下面的index這個Action。
那麼如何使用模型呢?實際上非常簡單。
2 |
class Test_IndexModel extends Tp_Model { |
3 |
public function test() { |
原理和控制器一樣,也是繼承架構的類,然後自訂方法,這個地方的方法名沒有限制,可以隨意。
那麼編寫模型之後怎麼在控制器中調用呢,其實方法就是在控制器中執行個體化這個模型類,然後調用相應的方法即可,所以修改剛才這個控制器的類:
2 |
class Test_IndexController extends Tp_Controller { |
3 |
public function indexAction() { |
4 |
$model = new Test_IndexModel(); |
為什麼沒有include語句?
那是因為架構幫你做完了這一切,當然,架構不是萬能的,當你比較熟悉之後,也可以選擇不使用自動匯入。
剛才我們所做的一切都沒有View,那麼怎麼編寫View呢,實際上就是一個HTML檔案,架構在View這一層一般是實現標籤庫,標籤庫幫你完成一些原來需要用PHP代碼才能完成的事情,比如迴圈遍曆,沒有標籤庫可能你就只能在這個View的檔案中使用<?php foreach(.....) ?>,這樣對於代碼分離很不好。
如果你對標籤庫沒有概念,那麼你直接看下面的代碼吧!
6 |
<print name = "Hello world!" type = "str" /> |
這是一段沒有什麼難度的代碼,唯一的難度可能就是這個print標籤,這個標籤是架構定義的,它的功能很簡單,就是列印一個字串,你可能覺得這樣沒什麼意義,因為我使用PHP代碼也可以很輕易的完成這個功能,但是你想像一下一個做前端的為什麼還需要懂PHP呢,如果使用標籤庫,那麼前端開發人員就可以像使用HTML標籤一樣操作資料了。
我們知道所有的請求都必須要通過控制器,所以外部是無法直接存取這個視圖檔案的,所以又需要修改控制器的代碼了!!!
2 |
class Test_IndexController extends Tp_Controller { |
3 |
public function indexAction() { |
4 |
$model = new Test_IndexModel(); |
6 |
$this->_display('Test.test'); |
如果你學過smarty,你可能對display方法很熟悉,實際上這個函數的功能就是顯示一個模板檔案!!!
好了,一個基本的MVC應用就搭起來了,不是很難吧!!!
如何查看效果呢,有兩種方式:
1.CGI:
開啟瀏覽器,瀏覽器訪問時,如果您的網域名稱是:localhost/testframework,那麼您可以使用localhost/testframework/Public/index.php/Test/Index/index來訪問,如果您設定了虛擬機器主機,如www.a.com,那麼只需要使用www.a.com/Test/Index/index就可以訪問了;
2.CLI:
通過命令列直接執行PHP指令碼時,在Public目錄下面使用php index.php m:test c:Index a:index。
剛才是使用架構實現了一個MVC的應用,那麼怎麼不使用架構來構建一個MVC應用呢?
下次再講,請繼續關注!!!!