路由定义
路由一定是基于应用的(也就是说路由是不支持跨应用的),对于多应用模式来说,一个常见的误区就是认为路由规则是全局的,但事实上是,路由并不能简化或改变URL地址中的应用名(或入口文件),这看起来是一件很糟糕的事情但秩序凌驾于一切,解决办法可以参考前一章的多应用内容。如果你纠结的话,请使用单应用,起码那样可以通过路由改变URL的一切。
路由配置已经从应用配置文件中独立了,具体可以参考默认的路由配置文件的说明。
新版的路由定义必须使用方法注册,不再支持使用配置文件定义了。
最简单的路由可以是一个闭包
Route::get('hello', function() {
return 'Hello,ThinkPHP';
});
可以支持路由变量定义(包括依赖注入支持)
Route::get('hello/:name', function($name) {
return 'Hello,' . $name;
});
大多数情况,都是路由到一个控制器方法,例如,下面的路由表示路由到Index控制器的hello操作(注意不一定是hello方法,因为可能设置了操作方法后缀的)
Route::get('hello/:name', 'Index/hello');
默认情况下,路由并非完整匹配,所以如果你定义了下面的路由
Route::get('hello', 'Hello/index');
Route::get('hello/:name', 'Index/hello');
如果访问的URL是
http://tp.com/hello/think
永远只会匹配到第一条路由。办法是把路由规则复杂的放到前面
Route::get('hello/:name', 'Index/hello');
Route::get('hello', 'Hello/index');
但有时候路由多了之后容易困惑,这个时候定义一个完整匹配的路由是最省事的,如下:
Route::get('hello$', 'Hello/index');
Route::get('hello/:name$', 'Index/hello');
路由注册的时候可以带上匹配条件检查,例如
Route::get('hello/:name', 'Index/hello')
->ext('html')
->https();
表示只有当访问
https://tp.com/hello/think.html
才会匹配该路由。
如果你的路由地址是相同的话,上面的两条路由可以合并为一条路由,例如:
Route::get('hello/[:name]$', 'Index/hello');
[:name]表示可选路由变量。
允许注册任何请求类型的路由规则,包括
Route::get('blog/:id','Blog/read');
Route::post('blog', 'Blog/save');
Route::put('blog/:id', 'Blog/update');
Route::delete('blog/:id', 'Blog/delete');
Route::patch('blog/:id','Blog/patch');
Route::options('blog','Blog/info');
你可以注册一个可以接受任何请求类型的路由
Route::any('hello','Index/hello');
或者注册一个多个请求类型的路由
Route::rule('hello','Index/hello', 'get|post');
如果要注册一个重定向路由,使用
Route::redirect('hello', '/redirectUrl', 301);
可以直接路由到模板,而不通过控制器
Route::view('hello/:name', 'index/hello');
在view/index/hello.html模板文件中可以直接使用路由变量。
直接路由到某个类的方法可以使用
Route::get('hello', '\app\controller\Hello@index');
可以路由到一个Response对象,例如对不存在的资源文件访问请求设置404访问
Route::get('static', response()->status(404));
在路由规则较多(超过100以上)的情况下,尤其是路由分组的数量明显少于路由规则的时候,应该开启路由延迟解析以及路由合并解析,最后开启路由缓存,可以明显提升路由性能(数量级的提升)。
// 是否开启路由延迟解析
'url_lazy_route' => true,
// 合并路由规则
'route_rule_merge' => true,
如果你某个应用不需要使用路由,可以在该应用下的app.php配置文件中设置
'with_route' => false,
出于安全考虑,我们建议对于开启路由的应用,应当设置强制路由
// 强制使用路由
'url_route_must' => true,
开启强制路由后,你必须给每个URL访问定义路由规则,包括首页。
Route::get('/', 'index/index');
路由分组
对路由进行分组可以有效提高路由的匹配性能,例如:
Route::group('blog', function() {
Route::get(':id', 'Blog/read');
Route::get(':name', 'Blog/read');
})->ext('html')->pattern(['id' => '\d+']);
如果你需要注册一个虚拟的路由分组,可以直接在第一个参数使用闭包
Route::group(function() {
Route::get('blog/:id', 'Blog/read');
Route::get('user/:name', 'User/read');
})->ext('html')->pattern(['id' => '\d+']);
URL生成
路由Url生成的用法做了改进,原来的Url类移到了路由下面,如果要生成下面的路由规则的地址
Route::get('hello/:name','index/hello');
你可以使用
Route::buildUrl('index/hello', ['name' => 'thinkphp']);
或者使用助手函数
url('index/hello', ['name' => 'thinkphp']);
该方法返回的是一个think\route\Url对象,方便设置生成的URL地址,例如
$url = Route::buildUrl('index/hello', ['name' => 'thinkphp'])
->suffix('html')
->domain('blog');
你可以直接echo输出或者使用(string)强制转换为字符串即可。
对于URL生成的路由变量之外的参数默认使用普通参数模式,例如:
echo url('index/hello', ['name' => 'thinkphp' , 'extra' => 'test']);
最终输出的URL地址是
http://tp.com/hello/thinkphp?extra=test
如果你希望生成的URL地址是
http://tp.com/hello/thinkphp/extra/test
需要设置route.php文件中的url_common_param配置参数。
'url_common_param' => false,
发表评论