實際上要自己實現一個MVC的應用也不難,我們知道MVC裡面所有內容都必須經過控制器,所以如何把控制權交給控制器呢?
我們需要一個入口檔案,入口檔案負責將傳遞的請求交給對應的控制器,實際上也就是完成路由的功能。
為了學習的需要,可以將路由的功能簡化,使用者通過GET方式將控制器的名和Action的名傳遞過來,入口檔案接收到所有參數之後,按照之前約定的規則include某一個檔案,然後執行個體化這個類,再調用這個類的相應方法。
02 |
$controller = empty($_GET['c']) ? 'Index' : trim($_GET['c']); //設定了預設的控制器 |
03 |
$action = empty($_GET['a']) ? 'index' : trim($_GET['a']); //設定了預設的Action |
04 |
$controllerBasePath = dirname(__FILE__) . '/modules/controllers/'; |
05 |
$controllerFilePath = $controllerBasePath . $controller . 'Controller.php'; |
06 |
if(is_file($controllerFilePath)) { |
07 |
include $controllerFilePath; |
08 |
$controllerName = $controller . 'Controller'; |
09 |
if(class_exists($controllerName)) { |
10 |
$controllerHandler = new $controllerName(); |
11 |
if(method_exists($controllerHandler,$action)) { |
12 |
$controllerHandler->$action(); |
14 |
echo 'the method does not exists'; |
17 |
echo 'the class does not exists'; |
20 |
echo 'controller not exists'; |
看著程式碼數還是挺多的哦,實際上實現的功能比較簡單,就是通過接受通過GET方式傳遞的控制器名和Action名,如果沒有傳遞,那麼調用預設的控制器名或者Action名,當使用者傳遞了控制器名和Action名之後可能會存在這樣一個問題,就是通過我們之前約定的規則找不到相應的檔案或者類或者方法,那麼我們需要顯示友好的資訊,而不是讓PHP拋出一系列的警告,這樣對於程式的健壯性很有協助。
當有了控制器之後,一切都變得簡單了,對於模型,我們可以把它看成是一個普通的類,只是在功能上它負責商務邏輯的處理。
3 |
public function test() { |
作為示範,我們只是在這個模型裡面返回一個Hello World,那麼控制器怎麼使用這個模型呢,實際上也就是首先include這個檔案,然後執行個體化類,調用相應的方法。
我們現在修改控制器為:
02 |
class IndexController { |
03 |
public function index() { |
04 |
$modelPath = dirname(__FILE__) . '/../models/IndexModel.php'; |
05 |
if(file_exists($modelPath)) { |
07 |
$model = new IndexModel(); |
10 |
echo 'model does not exists'; |
現在模型有了,那麼怎麼串連視圖呢?
5 |
<p><?php if(isset($var1)) {echo $var1; } ?></p> |
寫完視圖之後,怎麼通過控制器調用這個視圖呢?
修改控制器至如下:
02 |
class IndexController { |
03 |
public function index() { |
04 |
$modelPath = dirname(__FILE__) . '/../models/IndexModel.php'; |
05 |
if(file_exists($modelPath)) { |
07 |
$model = new IndexModel(); |
08 |
$var1 = $model->test(); |
09 |
$viewPath = dirname(__FILE__) . '/../views/index.php'; |
10 |
if(file_exists($viewPath)) { |
13 |
echo 'view does not exists'; |
16 |
echo 'model does not exists'; |
這樣一個MVC的應用就搭起來了,雖然比較簡陋,問題還多多!!!