#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
这里是后台的控制器首页
```