目录
0x01 路由模式
1.普通模式:
关闭路由,完全使用默认的PATH_INFO方式的URL,即http://服务器名/index.php/模块名/控制器名/方法名/name/value
首先在application/config.php中 将url_route_on 修改为false
打开nginx.conf配置文件
在原来的路径后面加上\index\index\index发现依然可以正常访问:
即localhost:888/tp5.0.11/public/index.php其实是localhost:888/tp5.0.11/public/index.php/index/index/index的缩写形式,如果index.php后面什么都不写,默认访问的就是index模块下的controller中的index.php的index方法,这个默认设置在application/config.php中可以看到:
如何使用PATH_INFO模式:
在application/index/controller/下创建一个User.php(首字母一定大写)
<?php
namespace app\index\controller;
class User{
public function hello(){
return "hello User";
}
}
注意:一定要写命名空间,然后照着葫芦(Index.php)画瓢子(User.php)
然后在application/下创建一个admin目录,在admin下创建一个controller目录,在controller下创建一个Index.php(首字母大写)
内容如下:
<?php
namespace app\admin\controller;
class Index{
function say(){
return "hello admin";
}
}
访问:
注意点:
1.命名空间一定要写上
2.controller下的文件名都是首字母大写,且文件中类名和文件名要一致
2.强制模式:
开启路由,并设置:必须定义路由才能访问
使用路由:
(1)设置路由规则:application/route.php
添加红框内的内容:(路由的注册)
访问:
如果say函数有参数怎么办呢?
修改index.php文件:
注意:再开头加上use think\Request;
修改route.php
访问:
另一种接收值的方式
<?php
namespace app\admin\controller;
class Index{
public function say($name){
dump($name);
return "hello admin";
}
}
firefox插件:
windows:httpRequester
Mac:ApiPost
通用:hackbar
1.route.php中配置get请求规则和post请求规则:
2.在appplication/controller/index.php中添加对应的函数:
3.get访问:
post访问:
3.在route.php中配置put请求和delete请求的规则:
Route::put('admin','admin/index/index_put');
Route::delete('admin','admin/index/index_delete');
然后在application/controller/index.php中增加对应的方法:
public function index_put(){
dump("this is put");
}
public function index_delete(){
dump("this is delete");
}
put请求访问:
delete请求访问:
如何匹配所有类型的请求呢?
1.在route.php中增加一条any路由规则:
Route::any('anyRequest','admin/index/index_any');
2.在index.php中增加对应的方法:
public function index_any(){
dump("this is any");
}
3.以各种形式访问:
4.现在any能匹配所有类型的请求,我们可以限制any可以匹配的请求类型,例如:让any只匹配put请求
Route::any('anyRequest','admin/index/index_any',['method'=>'put']);
如何对get传参进行限制呢?
route.php中这样写规则:
Route::get('admin/:name','admin/index/index_get','',['name'=>'^\d{2}$']);
这样只有get传参为两位数字的时候才能正常访问。
并且在路由规则中,我们还可以实现一种伪静态:
Route::get('admin/:name','admin/index/index_get',['ext'=>'html'],['name'=>'^\d+$']);
这样就限制了在参数之后必须加上.html才能正常访问
如果该项不设置(设置为''),加上html后缀和不加html后缀都可以正常访问,因为配置文件config中是这样默认设置的:
3.路由分组:
Route::put('admin/put','admin/index/index_put');
Route::delete('admin/delete','admin/index/index_delete');
Route::post('admin/post','admin/index/index_post');
Route::get('admin/get/:name','admin/index/index_get');
等价写法:
Route::group('admin',function(){
Route::put('put','admin/index/index_put');
Route::delete('delete','admin/index/index_delete');
Route::post('post','admin/index/index_post');
Route::get('get/:name','admin/index/index_get');
});
这样就叫路由分组,例如可以通过路由分组,将网站前台和后台的路由规则分开,前后home,后台admin
4.闭包路由:
Route::get('welcome/:name',function($name){
return 'welcome study tp5'.$name;
});
5.默认路由:
当你所有的路由规则都匹配不上的时候,就会匹配这则路由:
Route::miss('admin/index/miss');
6.资源路由:
在admin/controller/下创建一个Article.php:
<?php
namespace app\admin\controller;
class Article{
public function index(){
dump('this is index');
}
public function create(){
dump('this is create');
}
public function save(){
dump('this is save');
}
public function read(){
dump('this is read');
}
public function edit(){
dump('this is edit');
}
public function update(){
dump('this is update');
}
public function delete(){
dump('this is delete');
}
}
在route.php中配置一条资源路由:
不用指定方法,指定到控制器名即可。
Route::resource('article','admin/article');
设置后会自动注册7个路由规则:
Route::get('article','admin/article/index');
Route::post('article','admin/article/save');
//增
Route::get('article/create','admin/article/create');
//查
Route::get('article/:name','admin/article/read');
//改
Route::get('article/:name/edit','admin/article/edit');
Route::put('article/:name','admin/article/update');
//删
Route::delete('article/:name','admin/article/delete');
7.总结:
普通模式 即pathInfo模式下,访问必须有模块/控制器/方法,如果之后还要加什么参数的话,url会很长
强制模式 即路由模式,可以简化url,并且还可以对参数进行过滤限制。
推荐用强制模式。