该组件为系统组件,在组件树中只可命名为 route ,不可修改为其他名称。

路由

路由是 MixPHP 的核心组件之一,秉承极简理念,底层使用正则构建,好用又简单,默认配置了控制器一级目录的访问规则,控制器多级目录需增加路由规则。

调用
mix\base\Route \Mix::app()->route

路由配置

在App配置文件中,关于路由组件的默认配置如下:

通常你不需要修改配置就能完成大部分的开发任务。

// 路由
'route'    => [
    // 类路径
    'class'          => 'mix\base\Route',
    // 默认变量规则
    'defaultPattern' => '[\w-]+',
    // 路由变量规则
    'patterns'       => [
        'id' => '\d+',
    ],
    // 路由规则
    'rules'          => [

    ],
],

路由规则

路由规则在 rules 字段内定义,例如:

// 路由规则
'rules'          => [
	'api/:controller/:action' => 'api/:controller/:action',
],

上面定义了一个api接口的规则,匹配的URL与指向的功能如下:

URL 控制器::方法
http://site.com/api/user controller\api\UserController::actionIndex
http://site.com/api/user/setting controller\api\UserController::actionSetting
http://site.com/api/user_info/setting_profile controller\api\UserInfoController::actionSettingProfile
http://site.com/api/user-info/setting-profile controller\api\UserInfoController::actionSettingProfile

路由规则还支持HTTP请求方法匹配:

// 路由规则
'rules'          => [
    // 只有GET或POST才可访问
	'GET|POST api/:controller/:action' => 'api/:controller/:action',
],

框架支持的全部请求方法如下:

CLI|GET|POST|PUT|PATCH|DELETE|OPTIONS|HEAD|TRACE

通过HTTP请求方法匹配,能够很简单的构建出 RESTful 风格。

// 路由规则
'rules'          => [
    'GET api/:controller'                => 'api/:controller/index',
    'POST api/:controller'               => 'api/:controller/save',
    'GET api/:controller/:id'            => 'api/:controller/read',
    'PUT api/:controller/:id'            => 'api/:controller/update',
    'DELETE api/:controller/:id'         => 'api/:controller/delete',
],

默认路由规则

如果你没有定义任何路由规则,框架会默认定义下面的规则:

// 首页
''                    => 'index/index',
// 一级目录
':controller/:action' => ':controller/:action',

所以你什么都不定义就可以访问 首页 与 一级目录的控制器。

路由变量

上一节中 :controller :action 就是路由变量,但是这两个变量是特殊变量,是专用于指向控制器与方法的,其他名称的变量为普通变量。

下面演示一下普通变量的使用:

// 路由规则
'rules'          => [
	'news/article/:id' => 'new/article',
],

匹配的URL与指向的功能如下:

URL 控制器::方法
http://site.com/news/article/548762154 controller\NewsController::actionArticle

上面定义的普通变量并没有在规则中使用,而是需要在控制器代码中使用,代码中可以这样获取变量值:

// 获取全部路由变量
\Mix::app()->request->route();
// 获取单个路由变量
\Mix::app()->request->route('id');

路由变量规则

路由变量也是可以定义规则的,规则是正则表达式,在 patterns 字段内定义。

定义了变量规则后,当变量所在URL段不符合规则时,框架会抛出404错误。

默认变量规则

如果你没有为变量定义规则,默认为 defaultPattern 字段内定义的规则,如果你连 defaultPattern 也没有定义,则默认为 [\w-]+