[关闭]
@xxliixin1993 2015-11-07T06:54:02.000000Z 字数 3083 阅读 1210

Frame

入口文件

index.php

功能: 定义网站根目录。初始化程序,实现类的自动加载,路由分发。

路由规则

url : 网站域名/前台(home)|后台(admin)/控制器/动作名?参数名1=参数值1&参数名2=参数值2

Example:

www.frame.com/admin/index/index/?key1=val1&key2=val2

这时会去请求app\controller\admin\IndexController.class.php的indexAction方法,传参为key1,key2 值为val1,val2

Apache rewrite 配置

<VirtualHost 127.0.0.6:80>
    DocumentRoot "d:/test/Frame"

    RewriteEngine on

    #如果文件存在,就直接访问文件,不进行下面的RewriteRule.(不是文件或文件不存在就执行重写)
    RewriteCond %{SCRIPT_FILENAME} !-f
    #如果目录存在就直接访问目录不进行RewriteRule
    RewriteCond %{SCRIPT_FILENAME} !-d
    #如果是这些后缀的文件,就直接访问文件,不进行Rewrite 
    RewriteCond %{REQUEST_URI} !^.*(\.css|\.js|\.gif|\.png|\.jpg|\.jpeg)$ 
    #匹配到任意字符都跳转到/index.php,并停止分析以后规则的重写
    RewriteRule . /index.php [L] 
</VirtualHost>

RewriteRule规则:

RewriteRule ^/world/list/(?:_l([0-9]+))?(?:_a([0-9\-]+))?(?:_u([0-9]+))?(?:_n([0-9]+))?(?:_x([0-9]+))? /world/index.php?c=world&a=worldListIndex&listType=$1&path=$2&purpose=$3&pricemin=$4&pricemax=$5 [QSA,L]

Example

RewriteRule /pages/(.+) /page.php?page=$1 [QSA]
大意就是: 使用了[QSA]标记 /pages/123?one=two  会变成这样 /page.php?page=123&one=two
没有使用就只能这样,(就是说.?之后的不包括在(.*)里)/page.php?page=123
Rewrite标志
R[=code](force redirect) 强制外部重定向
G(force URL to be gone) 强制URL为GONE,返回410HTTP状态码。
P(force proxy) 强制使用代理转发。
L(last rule) 表明当前规则是最后一条规则,停止分析以后规则的重写。
N(next round) 重新从第一条规则开始运行重写过程。
C(chained with next rule) 与下一条规则关联
如果规则匹配则正常处理,该标志无效,如果不匹配,那么下面所有关联的规则都跳过
T=MIME-type(force MIME type) 强制MIME类型
NS (used only if no internal sub-request) 只用于不是内部子请求
NC(no case) 不区分大小写
QSA(query string append) 追加请求字符串
NE(no URI escaping of output) 不在输出转义特殊字符    

配置文件

配置文件应写在/data/config/下以 配置文件名.config.php的格式命名(例:DataBase.config.php)

使用方法

Example:

url:http://www.frame.com/admin/index/index

/app/controller/admin/IndexController.class.php代码
<?php 
    namespace app\controller\admin;
    use core\Controller;
    /**
     * 后台首页
     */
    class IndexController extends Controller {
        //配置文件
        public $config;
        /**
         * 构造函数
         */
        public function __construct(){
            parent::__construct();
            //echo 'app\controller\admin --IndexController __construct';
        }

        public function indexAction(){
            var_dump($this->config['DataBase']);
    			var_dump($this->config['Model']);
        }    

    }
输出:
array (size=2)
  'master' => 
    array (size=5)
      'type' => string 'MySQL' (length=5)
      'host' => string '127.0.0.1' (length=9)
      'user' => string 'root' (length=4)
      'password' => string '123456' (length=6)
      'dbname' => string 'test' (length=4)
  'slave' => 
    array (size=2)
      'slave1' => 
        array (size=5)
          'type' => string 'MySQL' (length=5)
          'host' => string '127.0.0.1' (length=9)
          'user' => string 'root' (length=4)
          'password' => string '123456' (length=6)
          'dbname' => string 'test' (length=4)
      'slave2' => 
        array (size=5)
          'type' => string 'MySQL' (length=5)
          'host' => string '127.0.0.1' (length=9)
          'user' => string 'root' (length=4)
          'password' => string '123456' (length=6)
          'dbname' => string 'test' (length=4)
array (size=1)
  'user' => 
    array (size=1)
      'observer' => 
        array (size=3)
          0 => string 'App\Observer\UserAdd1' (length=21)
          1 => string 'App\Observer\UserAdd3' (length=21)
          2 => string 'App\Observer\UserAdd4' (length=21)    

Next

1.可以改用pathinfo这个函数来实现请求分发功能而不是用$_SERVER[PHP_SELF]

/**
 * $_SERVER[PHP_SELF]返回的是一段信息,如“/upload/try.php”
     * 而后面的则返回一个数组:
     * 如:
     * $path_parts = pathinfo('index.html');
 * echo $path_parts['dirname'], "\n";
     * echo $path_parts['basename'], "\n";
 * echo $path_parts['extension'], "\n";
     * echo $path_parts['filename'], "\n"; // since PHP 5.2.0
 * 将返回:
 * /upload
 * index.html
 * html
 * index
 */

2.通过配置路由请求

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注