#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
這里是后臺的控制器首頁
```