多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
#12.项目后台mvc架构 其实后台和前台差不多,在web下也有一个index.php文件,然后也需要隐藏index.php,所以我们直接将.htaccess也拿过来。 ```cpp |-web 后台 | |-.htaccess 后台分布式配置文件 RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FIELNAME} !-d RewriteRule ^(.*)$ index.php?url=$1 [QSA,L] ``` 然后后台入口文件和前台的入口文件内容也差不多,只是引入文件的路径需要调整。还有就是我们要区分前后台,根据前后台定义的变量APP来判断。前台入口文件也需要定义 define('APP','app'); ```cpp |-web 后台 | |-index.php 项目后台入口文件,单一入口 <?php /** * 项目后台入口文件 * User: find35.com * Date: 15/12/27 * Time: 下午3:12 */ echo "<meta charset='utf-8'>"; require_once '../core/App.class.php'; //注册一个 define('APP','web'); spl_autoload_register(array('App','myAutoloader')); try{ App::run(); }catch(MyException $e){ $e->showError(($e->getMessage())); } ``` 然后我们也需要根据入口文件传递的APP来调整app.class.php文件里面的路径。 ```cpp |-core 框架核心目录 | |-App.class.php URL重写类 <?php /** * Created by PhpStorm. * User: find35.com * Date: 15/12/25 * Time: 上午10:53 */ class App { protected static $controller = 'Home';//控制器名 protected static $method = 'index';//方法名 protected static $pams = array();//其他参数 /** * url重写路由的url地址解析方法 */ protected static function paseUrl(){ if(!empty($_GET['url'])){ $url = explode('/',$_GET['url']); //得到控制器 if(isset($url[0])){ self::$controller = $url[0]; unset($url[0]); } //得到方法名 if(isset($url[1])){ self::$method = $url[1]; unset($url[1]); } //判断是否有其他参数 if(isset($url)){ self::$pams = array_values($url); } } } /** * 项目的入口方法 * @throws Exception */ public static function run(){ self::paseUrl(); //判断是前台还是后台 if(APP == 'app'){ //得到控制器的路径 $url = 'app/controllers/'.self::$controller.'.class.php'; } if(APP == 'web'){ //得到控制器的路径 $url = 'controllers/'.self::$controller.'.class.php'; } //判断控制器文件是否存在 if(file_exists($url)){ $c = new self::$controller; }else{ throw new MyException('控制器不存在'); } //执行方法 if(method_exists($c,self::$method)){ $m = self::$method; $new_pams = array(); $num = count(self::$pams); //传递参数,判断是否有参数 if($num > 0){ //判断传递的参数的数量是否是2的倍数 if($num % 2 == 0){ //将参数进行处理 for($i=0;$i<$num;$i+=2){ $new_pams[self::$pams[$i]] = self::$pams[$i+1]; } }else{ throw new MyException('非法参数!'); } } $c->$m($new_pams); }else{ throw new MyException('方法不存在'); } } /** * 自动加载类方法 * @param $className * @throws Exception */ public static function myAutoloader($className){ if(APP == 'app'){ //控制器类文件目录 $controller = 'app/controllers/'.$className.'.class.php'; //模型类文件目录 $model = 'app/models/'.$className.'.class.php'; //核心类文件目录 $core = 'core/'.$className.'.class.php'; } if(APP == 'web'){ //控制器类文件目录 $controller = 'controllers/'.$className.'.class.php'; //模型类文件目录 $model = 'models/'.$className.'.class.php'; //核心类文件目录 $core = '../core/'.$className.'.class.php'; } if(file_exists($controller)){ require_once $controller; }else if(file_exists($model)){ require_once $model; }else if(file_exists($core)){ require_once $core; }else{ throw new MyException('类文件不存在'); } } } ``` 然后我们也建立一个后台首页控制器 ```cpp |-web 后台 | |-controllers 存放所有的控制器目录 | |-Home.class.php 后台首页控制器 <?php /** * 网站后台首页 * User: find35.com * Date: 15/12/27 * Time: 下午3:19 */ class Home { public function index(){ echo '这里是后台的控制器首页'; } } ``` 此时我们在浏览器中输入 ```cpp http://localhost/php_mvc/web/ ``` 如果显示如下则表示成功 ```cpp 这里是后台的控制器首页 ```