thinkphp5 路由

/ 0评 / 0

一、什么是路由

路由的作用是为了简化URL访问地址,提高URL地址的可读性。Thinkphp5通过我们定义的路由来调用不同的控制器进行执行,最后将返回结果输出到浏览器中。

二、thinkphp5中的路由模式

1、普通模式
关闭路由,完全使用默认的PATH_INFO方式URL:

'url_route_on'  =>  false,

路由关闭后,不会解析任何路由规则,采用默认的PATH_INFO 模式访问URL:

http://think5.test/index.php/module/controller/action/param/value/...

但仍然可以通过操作方法的参数绑定、空控制器和空操作等特性实现URL地址的简化。
可以设置url_param_type配置参数来改变pathinfo模式下面的参数获取方式,默认是按名称成对解析,支持按照顺序解析变量,只需要更改为:

// 按照顺序解析变量
'url_param_type'    =>  1,

2、混合模式
开启路由,并使用路由定义+默认PATH_INFO方式的混合:

'url_route_on'  =>  true,
'url_route_must'=>  false,

该方式下面,只需要对需要定义路由规则的访问地址定义路由规则,其它的仍然按照第一种普通模式的PATH_INFO模式访问URL。

3、强制模式
开启路由,并设置必须定义路由才能访问:

'url_route_on'  		=>  true,
'url_route_must'		=>  true,

这种方式下面必须严格给每一个访问地址定义路由规则(包括首页),否则将抛出异常。
首页的路由规则采用/定义即可,例如下面把网站首页路由输出Hello,world!(有点Laravel的味道啊~)

Route::get('/',function(){
    return 'Hello,world!';
});

三、thinkphp5中常见路由定义方法

1.普通路由
路由注册可以采用方法动态单个和批量注册,也可以直接定义路由定义文件的方式进行集中注册。
动态注册
路由定义采用\think\Route类的rule方法注册,通常是在应用的路由配置文件application/route.php进行注册,格式是:

Route::rule('路由表达式','路由地址','请求类型','路由参数(数组)','变量规则(数组)');

use think\Route;
// 注册路由到index模块的user控制器的info操作
Route::get('/userinfo','user/info');

然后我们访问
http://think5.test/userinfo

发现和访问下面的默认路由效果是一样的
http://think5.test/index/user/info

路由参数
可以在配置的时候添加参数,比如添加后缀

Route::get('/userinfo','user/info',['ext'=>'html']);

那么访问的时候必须有后缀名,不然会访问不到
http://think5.test/userinfo.html

也可以在访问的时候添加参数

Route::get('/userinfo/:id','user/info',['ext'=>'html']);

那就可以传递一个id参数了
http://think5.test/userinfo/1.html

具体的使用方式太多惹,可以查看官方文档~

2.资源路由
thinkphp5支持设置RESTFul请求的资源路由,会快捷生成我们需要的路由,当然了,控制器中一定要写对应的方法,不然会报错滴,方式如下:

Route::resource('/user','index/User');

这就很laravel了啊,直接自动注册所有的路由,但是还不够智能~

标识 请求类型 生成路由规则 对应操作方法(默认)
index GET user index
create GET user/create create
save POST user save
read GET user/:id read
edit GET user/:id/edit edit
update PUT user/:id update
delete DELETE user/:id delete

3.快捷路由
快捷路由允许你快速给控制器注册路由,并且针对不同的请求类型可以设置方法前缀,例如:

Route::controller('/user','index/User');

然后我们访问的路由就变成下面的了
get http://think5.test//user/info

但是会报错,因为需要我们去写对应的方法,其实就是方法名以请求方法开头,比如

public function getInfo(){
        echo "获取用户信息";
}

四、thinkphp5中的miss路由

在网站开发的时候,为了提高用户的体验,我们一般都会单独定义一个404页面,在服务器出现问题的时候默认都跳转到这个404页面。在thinkphp5中,也为我们提供了一个miss路由的解决方案,当用户在访问一个并不存在的页面,thinkphp5会默认调用我们定义好的miss路由。例如:

Route::miss('index/miss');

当我们访问一个不存在的路由时,会默认调用上面路由中的方法。

public function miss(){
        $response = new Response();
        return $response->code(404)->data("没有找到页面");
}

五、thinkphp5中的分组路由

路由分组功能允许把相同前缀的路由定义合并分组,这样可以提高路由匹配的效率,不必每次都去遍历完整的路由规则。例如:

Route::group('user',function (){
    Route::get('/info','user/info');
    Route::get('/index','user/index');
});

也可以定义局部的miss路由

Route::group('user',function (){
    Route::get('/info','user/info');
    Route::get('/index','user/index');
    Route::miss('user/miss');
});

六、thinkphp5中的路由绑定

可以使用路由绑定简化URL或者路由规则的定义,绑定支持如下方式:

绑定到模块/控制器/操作

把当前的URL绑定到模块/控制器/操作,最多支持绑定到操作级别,例如在路由配置文件中添加:

// 绑定当前的URL到 index模块
Route::bind('index');
// 绑定当前的URL到 index模块的user控制器
Route::bind('index/user');
// 绑定当前的URL到 index模块的user控制器的info操作
Route::bind('index/user/info');

该方式针对路由到模块/控制器/操作有效,假如我们绑定到了index模块的user控制器,那么原来的访问URL从
http://think5.test/index/user/info/5

可以简化成(需要先定义路由的哦)
http://think5.test/info/5

绑定到命名空间
把当前的URL绑定到某个指定的命名空间,例如

// 绑定命名空间
Route::bind('\app\index\controller','namespace');

那么,我们接下来只需要通过
http://serverName/user/info/5

绑定到类
把当前的URL直接绑定到某个指定的类,例如:

// 绑定到类
Route::bind('\app\index\controller\User','class');

那么,我们接下来只需要通过
http://serverName/info/5

还有很多其他的,但是可能不常用,自己多看看文档研究啦~

评论已关闭。