做者: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架构],与我交流互动。