3.route

goer ... 2022-01-07 Thinkphp
  • Php
  • Thinkphp
大约 4 分钟

路由

[toc]

# Route

默认的URL地址显得有点长,下面就来说说如何通过路由简化URL访问。

提高安全性 都可以添加路由

// 是否开启路由
'url_route_on'           => true,
// 路由使用完整匹配
'route_complete_match'   => false,
// 路由配置文件(支持配置多个)
'route_config_file'      => ['route'],
// 是否开启路由解析缓存
'route_check_cache'      => false,
// 是否强制使用路由
'url_route_must'         => false,
//强制路由必须每个设置路由规则
1
2
3
4
5
6
7
8
9
10
11

路由定义文件(application/route.php)

规则
return[
	// 规则,admin模板index控制器,index方法
    'admin/:name' => 'admin/index/index',
];
//必须带参数的路由
以前:www.tp.com/admin/index/index/name
现在: www.tp.com/admin/name
1
2
3
4
5
6
7
8

定义路由规则后,原来的URL地址将会失效,变成非法请求。

// 两种写法
return[
	'admin/[:name]' => 'admin/index/index',
    // 参数可选,但是方法记得给默认值
];

// 2.
use think\Route;

Route::rule('admin/:name','admin/index/index');
1
2
3
4
5
6
7
8
9
10

完整匹配:

前面定义的路由是只要以hello开头就能进行匹配,如果需要完整匹配,可以使用下面的定义:

return [
  	'admin/[:name]$'  => 'admin/index/index',
];
// 路由规则以$结尾的时候就表示当前路由规则需要完整匹配。

//http://tp5.com/hello/thinkphp/val/value // 不会匹配
1
2
3
4
5
6

# 闭包定义

定义闭包为某些特殊的场景定义路由规则

return [
    // 定义闭包
    'hello/[:name]' => function ($name) {
        return 'Hello,' . $name . '!';
    },
];
// 或
use think\Route;

Route::rule('hello/:name', function ($name) {
    return 'Hello,' . $name . '!';
});

// 访问 http://tp5.com/hello/thinkphp
1
2
3
4
5
6
7
8
9
10
11
12
13
14

# URL分隔符

需要改变URL地址中的pathinfo参数分隔符

// 设置pathinfo分隔符
'pathinfo_depr'          => '-',
1
2

# 路由参数

还可以约束路由规则的请求类型或者URL后缀之类的条件

// 由规则限制了必须是get请求,而且后缀必须是html
return [
  // 定义请求类型和后缀
'back/:name$' => ['admin/index/index', ['method' => 'get','ext'=>'html']]
];
// www.tp.com/back/goer.html  这样才能访问
1
2
3
4
5
6

# 变量规则

定义 复杂的路由规则定义满足不同的路由变量 变量规则使用==正则表达式==进行定义

//定义控制器
namespace app\Admin\controller;

class Time
{
    public function id($id)
    {
        return 'id是'.$id;
    }

    public function name($name)
    {
        return 'name是'.$name;
    }

    public function day($year,$month)
    {
        return '时间是'.$year.'年'.$month.'月';
    }

}
//参数要和路由规则参数命名一样
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//定义规则
return [
	    'time/day/:year/:month' =>['admin/time/day',['method'=>'get'],['year' => '\d{4}','month' => '\d{2}']],

    'time/id/:id' => ['admin/time/id',['method' => 'get'],['id'=>'\d+']],
    'time/name/:name' => ['admin/time/name',['method' => 'get'] , ['name' => '\w+']]

];
1
2
3
4
5
6
7
8

访问:

http://www.abctp.com/time/day/1000/30 --> 时间是1000年30月

http://www.abctp.com/time/id/999 --> id是999

http://www.abctp.com/time/name/rads --> name是abc

# 路由分组

规则一致的可以简化, 路由分组一定程度上可以提高路由检测的效率

return[
      '[time]' => [
        'id/:id' => ['admin/time/id',['method' => 'get'],['id' => '\d+']],
        'name/:name' => ['admin/time/name',['method' => 'get'] , ['name' => '\w+']],
        'day/:year/:month$' => ['admin/time/day',['method'=>'get'],['year' => '\d{4}','month' => '\d{2}']],
    ]  
];
1
2
3
4
5
6
7

# 复杂路由

我们还需要对URL做一些特殊的定制

//如果想访问
http://tp5.com/time/day-2015-05

//规则要修改  day-<year>-<month>
'day-<year>-<month>' => ['admin/time/day',['method'=>'get'],['year' => '\d{4}','month' => '\d{2}']],
1
2
3
4
5

blog-<year>-<month> 这样的非正常规范,我们需要使用<变量名>这样的变量定义方式,而不是 :变量名方式。

变量规则统一定义

__pattern__中定义的变量规则我们称之为全局变量规则

return [
    // 全局变量规则
    '__pattern__'         => [
        'name'  => '\w+',
        'id'    => '\d+',
        'year'  => '\d{4}',
        'month' => '\d{2}',
    ],

    'blog/:id'            => 'blog/get',
    // 定义了局部变量规则
    'blog/:name'          => ['blog/read', ['method' => 'get'], ['name' => '\w{5,}']],
    'blog-<year>-<month>' => 'blog/archive',
];
1
2
3
4
5
6
7
8
9
10
11
12
13
14

# URL生成

定义路由规则之后,我们可以通过Url类来方便的生成实际的URL地址(路由地址)

// 输出 blog/thinkphp
Url::build('blog/read', 'name=thinkphp');
Url::build('blog/read', ['name' => 'thinkphp']);
// 输出 blog/5
Url::build('blog/get', 'id=5');
Url::build('blog/get', ['id' => 5]);
// 输出 blog/2015/05
Url::build('blog/archive', 'year=2015&month=05');
Url::build('blog/archive', ['year' => '2015', 'month' => '05']);
1
2
3
4
5
6
7
8
9

我们还可以使用系统提供的==助手函数url==来简化

url('blog/read', 'name=thinkphp');
// 等效于
Url::build('blog/read', 'name=thinkphp'
1
2
3

如果你配置了==url_html_suffix==参数的话,生成的URL地址会带上后缀,例如:

'url_html_suffix'   => 'html',

// blog/thinkphp.html 
1
2
3

通常在==模板文件==中输出的话,可以使用助手函数,例如:

{:url('blog/read', 'name=thinkphp')}
1

如果你的URL地址全部采用路由方式定义,也可以直接使用路由规则来定义URL生成,例如:

url('/blog/thinkphp');
Url::build('/blog/8');
Url::build('/blog/archive/2015/05');
1
2
3