一步步編寫PHP的Framework(二)

來源:互聯網
上載者:User

 

  實際上要自己實現一個MVC的應用也不難,我們知道MVC裡面所有內容都必須經過控制器,所以如何把控制權交給控制器呢?

       我們需要一個入口檔案,入口檔案負責將傳遞的請求交給對應的控制器,實際上也就是完成路由的功能。

       為了學習的需要,可以將路由的功能簡化,使用者通過GET方式將控制器的名和Action的名傳遞過來,入口檔案接收到所有參數之後,按照之前約定的規則include某一個檔案,然後執行個體化這個類,再調用這個類的相應方法。

01 <?php
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();
13         } else {
14             echo 'the method does not exists';
15         }
16     } else {
17         echo 'the class does not exists';
18     }
19 } else {
20     echo 'controller not exists';
21 }

        看著程式碼數還是挺多的哦,實際上實現的功能比較簡單,就是通過接受通過GET方式傳遞的控制器名和Action名,如果沒有傳遞,那麼調用預設的控制器名或者Action名,當使用者傳遞了控制器名和Action名之後可能會存在這樣一個問題,就是通過我們之前約定的規則找不到相應的檔案或者類或者方法,那麼我們需要顯示友好的資訊,而不是讓PHP拋出一系列的警告,這樣對於程式的健壯性很有協助。

         當有了控制器之後,一切都變得簡單了,對於模型,我們可以把它看成是一個普通的類,只是在功能上它負責商務邏輯的處理。

1 <?php
2 class IndexModel {
3     public function test() {
4         return 'Hello world!';
5     }
6 }

        作為示範,我們只是在這個模型裡面返回一個Hello World,那麼控制器怎麼使用這個模型呢,實際上也就是首先include這個檔案,然後執行個體化類,調用相應的方法。

         我們現在修改控制器為:

01 <?php
02 class IndexController {
03     public function index() {
04         $modelPath = dirname(__FILE__) . '/../models/IndexModel.php';
05         if(file_exists($modelPath)) {
06             include $modelPath;
07             $model = new IndexModel();
08             echo $model->test();
09         } else {
10             echo 'model does not exists';
11         }
12     }
13 }

   現在模型有了,那麼怎麼串連視圖呢?

1 <html>
2     <head>
3     </head>
4     <body>
5         <p><?php if(isset($var1)) {echo $var1; } ?></p>
6     </body>
7 </html>

        寫完視圖之後,怎麼通過控制器調用這個視圖呢?

        修改控制器至如下:

01 <?php
02 class IndexController {
03     public function index() {
04         $modelPath = dirname(__FILE__) . '/../models/IndexModel.php';
05         if(file_exists($modelPath)) {
06             include $modelPath;
07             $model = new IndexModel();
08             $var1 =  $model->test();
09             $viewPath = dirname(__FILE__) . '/../views/index.php';
10             if(file_exists($viewPath)) {
11                 include $viewPath;
12             } else {
13                 echo 'view does not exists';
14             }
15         } else {
16             echo 'model does not exists';
17         }
18     }
19 }

         這樣一個MVC的應用就搭起來了,雖然比較簡陋,問題還多多!!!



相關文章

Beyond APAC's No.1 Cloud

19.6% IaaS Market Share in Asia Pacific - Gartner IT Service report, 2018

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

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

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