睡不着,繼續寫一篇吧!! php
按照上一次我講的內容,一個基本的MVC構架是已經搭建起來了的,可是自己還存在不少問題,如:模型這一起每次鏈接DB,關閉DB的代碼冗餘,視圖這一起仍是PHP代碼,每一個文件要使用不少include代碼等等。 瀏覽器
要編寫一個框架,那麼首先就要規定一個標準的目錄結構,咱們暫時把這個目錄結構定死,不容許用戶修改,這樣能夠減小代碼量,方便你們看的更明白。 安全
因爲以前編寫了Toper,因此我準備沿用Toper的目錄結構來作演示: 框架
Library(框架存放目錄) 網站
Test(假設這個框架名就叫test) 插件
UserApps (用戶的APP存放目錄) 日誌
Configs(配置文件存放目錄) code
Modules(模塊存放目錄) blog
Controllers (全部控制器存放目錄) ip
Models (模型存放目錄)
Views (視圖存放目錄)
Helpers (輔助文件目錄)
Plugins(插件存放目錄,暫時用不上)
Public (網站根目錄)
index.php (最重要的入口文件)
這個地方有點須要解釋一下,Public目錄纔是網站的根目錄,Library目錄和UserApps目錄是存放在網站根目錄以外的,這樣用戶經過瀏覽器訪問時就不能直接訪問這個PHP文件,這樣能夠提升網站的安全性。
以前咱們把路由的功能所有放在入口文件這一起,實際上這是不合適的,入口文件不該該作這些邏輯的處理,因此咱們把以前存放在入口文件的代碼遷移到library目錄的Test目錄下面,因爲以前在入口文件中完成的功能是路由,因此咱們把代碼遷移到Route.php,這個文件就完成路由的功能。
好,咱們來看看Route.php這個文件的內容:
<?php class Route { public static function run() { $controller = empty($_GET['c']) ? 'Index' : trim($_GET['c']); //設置了默認的控制器 $action = empty($_GET['a']) ? 'index' : trim($_GET['a']); //設置了默認的Action $controllerBasePath = dirname(__FILE__) . '/../../UserApps/Modules/Controllers/'; $controllerFilePath = $controllerBasePath . $controller . 'Controller.php'; if(is_file($controllerFilePath)) { include $controllerFilePath; $controllerName = $controller . 'Controller'; if(class_exists($controllerName)) { $controllerHandler = new $controllerName(); if(method_exists($controllerHandler,$action)) { $controllerHandler->$action(); } else { echo 'the method does not exists'; } } else { echo 'the class does not exists'; } } else { echo 'controller not exists'; } } }
這個時候,看到沒,咱們只是把以前放在入口文件的代碼拷貝到Route.php這個文件中了,那麼這樣有什麼好處呢?
入口文件代碼少了!!!
<?php include dirname(__FILE__) . '/../Library/Test/Route.php'; Route::run();只有兩行的代碼,夠簡潔吧!!
可是你看到一個問題沒有,每次我都須要使用dirname來肯定當前路徑,而若是這個框架中有20個文件,每一個文件中有3處使用dirname來獲取絕對路徑,那麼感受到恐怖了吧,90處重複代碼,若是之後路徑一修改,那將會是你的噩夢!!
因此,咱們不妨在入口文件定義一個路徑,這個路徑做爲APP的基路徑,因爲咱們常常也會使用Library下面的Test目錄路徑,咱們也設置一個框架路徑,因此,入口文件修改成:
<?php defined('APP_PATH') || define('APP_PATH',dirname(__FILE__) . '/..'); defined('FRAMEWORK_PATH') || define('FRAMEWORK_PATH',APP_PATH . '/Library/Test'); include FRAMEWORK_PATH . '/Route.php'; Route::run();那麼Route.php相應的也須要修改:
<?php class Route { public static function run() { $controller = empty($_GET['c']) ? 'Index' : trim($_GET['c']); //設置了默認的控制器 $action = empty($_GET['a']) ? 'index' : trim($_GET['a']); //設置了默認的Action $controllerBasePath = APP_PATH . '/UserApps/Modules/Controllers/'; $controllerFilePath = $controllerBasePath . $controller . 'Controller.php'; if(is_file($controllerFilePath)) { include $controllerFilePath; $controllerName = $controller . 'Controller'; if(class_exists($controllerName)) { $controllerHandler = new $controllerName(); if(method_exists($controllerHandler,$action)) { $controllerHandler->$action(); } else { echo 'the method does not exists'; } } else { echo 'the class does not exists'; } } else { echo 'controller not exists'; } } }如今看這個代碼是否是要好多了!!!
可是經過MVC來構建應用的時候,常常會一個文件include不少類,那麼是否框架能夠實現自動導入類,而不採用手動include呢,請繼續關注個人日誌!!
本次代碼點此下載