做者:Terry Gaophp
做爲PHP Coder的入門進階,本身動手寫一個MVC框架能夠從各方面鞏固和加深你對PHP的理解,還能瞭解一些架構方面的基礎知識。git
MVC(Model-View-Controller,模型-視圖-控制器)是PHP最多見的一種開發模式。它將程序劃分爲三層。github
最上面的一層,是直接面向最終用戶的"視圖層"(View)。它負責給用戶提供操做界面,是程序的外殼。安全
最底下的一層,是核心的"模型層"(Model),負責檢索、組織和處理程序所需的數據或信息。微信
中間的一層,就是"控制層"(Controller),它負責根據用戶從"視圖層"輸入的指令,選取"模型層"中的數據,而後根據業務邏輯對其進行相應的操做,併產生最終結果。架構
文件結構以下
框架
www目錄將做爲網站的根目錄,能夠在Apache或Nginx的vhost配置中將www指定爲Document Root,將核心代碼放在根目錄之外,使得用戶沒法直接訪問到核心代碼,提升整站的安全性。網站
既然www是根目錄,那www下的index.php就能夠做爲整站的入口,固然,你也能夠在www下繼續寫usercenter.php、admin.php等來做爲其它模塊的入口,你只須要制定規則就好。ui
而做爲入口,因爲它能夠接收到發往它的全部數據,所以能夠按照框架制定的路由規則對數據進行分發處理。所以,在入口,須要引入初始化程序,而後進行路由分發。this
/* Nova/www/index.php */ <?php //給目錄定義一些常量 define('ROOT_DIR', __DIR__.'/..'); define('APP_DIR', ROOT_DIR.'/Application'); define('CONFIG_DIR', ROOT_DIR.'/config'); define('FRAMEWORK_DIR', ROOT_DIR.'/Framework'); define('LOG_DIR', ROOT_DIR.'/logs'); define('WWW_DIR', __DIR__.'/'); //設置一下站點的時區 define('TIMEZONE', 'Asia/Shanghai'); ini_set('data.timezone', TIMEZONE); //引入初始化程序 require FRAMEWORK_DIR.'/init.php';
/* Nova/Framework/init.php */ <?php namespace Nova\Framework; //引入配置文件 require CONFIG_DIR . '/config.php'; 引入自動加載類 require 'Autoloader.php'; //初始化自動加載 Autoloader::init(); //啓用Session Session::start(); //啓動核心處理程序 $core = new Core; $core->run();
初始化的過程涉及到了自動加載類及Session的處理,這兩部分咱們稍後介紹。先來講說核心處理程序,我把路由分發邏輯放在了這裏。
/* Nova/Framework/Core.php */ <?php namespace Nova\Framework; class Core { public function run() { $this->setReporting(); $this->route(); } /** * 設定整站的錯誤報告等級 */ public function setReporting() { if (DEBUG_MODE === true) { error_reporting(E_ALL); ini_set('display_errors', 'On'); } else { error_reporting(E_ALL); ini_set('display_errors', 'Off'); ini_set('log_errors', 'On'); ini_set('error_log', LOG_DIR . 'error.log'); } } /** * 路由規則 * * 使用$_REQUEST['act']來定位控制器的類 * 使用$_REQUEST['st']來定位具體的方法 */ public function route() { //若是$_REQUEST中沒有'act',則設定默認act爲index if (!isset($_REQUEST['act'])) { $_REQUEST['act'] = 'index'; } //若是$_REQUEST中沒有'st',則設定默認act爲main if (!isset($_REQUEST['st'])) { $_REQUEST['st'] = 'main'; } //根據act定位控制器類 $className = 'Nova\\Application\\Controllers\\' . $_REQUEST['act']; //判斷控制器類是否存在,不存在則報404 if (!class_exists($className)) { header('HTTP/1.1 404 Not Found'); die($className); } //生成目標控制器類對象 $obj = new $className(); //判斷方法是否存在,不存在則報404 if (!method_exists($obj, $_REQUEST['st'])) { header('HTTP/1.1 404 Not Found'); exit; } //執行目標方法 $obj->$_REQUEST['st'](); } }
你能夠在Github上查看Nova項目的源代碼。
若是你有任何問題或建議,能夠掃描下方二維碼或者微信搜索[phpjiagoushier],關注個人微信公衆號[PHP架構],與我交流互動。