1. tp URL 访问规则
ThinkPHP 采用单一入口模式访问应用,对应用得1所有请求都定义到入口文件,系统会按照一定的规则去解析URL。**http://serverName//index.php/module/controller/action**
- 注意1:在TP5里面,当使用URL进行访问的时候,地址栏目的控制器的名称无论是大小还是小写,都会被统一的转换为小写。
- 注意2:如果控制器文件的使用UserInfo形如这样的命名,需要使用下划线访问。如果不希望转换,同时,我们自己写的控制器的访问也不希望转换为小写,可以配置 url_convert = false 即可
2. get 参数处理
继续向 Goods.php 文件中 添加方法,我在方法中绑定了一个默认的参数
<?php// get 参数处理public function fun1($id = 0){dump($id);}
不添加参数访问,将会使用默认设置的参数
添加参数访问,将会使用我设置的 url 中传递的参数。只需要 方法名称/参数名称/参数值
3. nginx 下隐藏入口文件
只需要修改 nginx 下的入口文件就好,需要我自己根据这个练习项目单独配置一个 server 配置,其中Line11 的 if 判断开始,起到关键作用。
## 本地练习使用server {listen 80;root "F:/phpStudy_2016/WWW/tp5.1/public";server_name tp5.1.com;location / {index index.html index.htm index.php;autoindex on;# 起作用的在这里if (!-e $request_filename) {rewrite ^(.*)$ /index.php?s=/$1 last;break;}}location ~ \.php(.*)$ {fastcgi_pass 127.0.0.1:9000;fastcgi_index index.php;fastcgi_split_path_info ^((?U).+\.php)(/?.+)$;fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;fastcgi_param PATH_INFO $fastcgi_path_info;fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;include fastcgi_params;include fastcgi.conf;}location ~ .*\.(css|js|gif|jpg|jpeg|png|bmp|swf)$ {root "F:/phpStudy_2016/WWW/tp5.1/public";expires 30d;}}
修改后的效果,如下图:现在不需要 在tp5.1.com 的后面 添加 /index.php 这个入口文件了
4. 路由定义
4.1 查看系统默认的路由文件
- 注意1: 在Tp5里面,路由并不是必须的,不使用路由的情况下,照样可以使用pathinfo的方式进行访问。
- 例如:域名/[index.php入口文件]/index模块名称/index控制器名称/lst方法名称/get参数
- 注意2:也可以开始Tp5的路由和pathinfo同时一起使用。修改配置文件进行开启
- app/下的config.php 中配置相关的规则
查看系统默认的路由文件 route\route.php
<?phpRoute::get('think', function () {return 'hello,ThinkPHP5!';});Route::get('hello/:name', 'index/hello');
按照系统定义的方式,先去访问一下。
访问定义的第一个路由规则
访问定义的第二个路由规则
4.2 自定义路由规则
先创建一个自定义的路由规则文件,位置 route\myRoute.php , 不像 laravel 一样 tp5.1中不需要我们再去手动的注册路由。直接在 route 目录下定义的php文件就行
4.2.1 闭包
不经过控制器,直接从路由规则文件中返回响应。也就是通过以一个闭包返回响应。在刚刚创建的文件中添加下列代码
<?php/*** 这是一个自定义的 路由定义文件*/Route::get('test1', function () {return 'test1';});return [];
postman 测试一下:
4.2.2 rule 不限制请求的类型
使用 Route::rule() 不使用第三个参数,就不会限制请求的类型。如下面的代码,测试时使用 put 请求
<?php# 不限制访问的请求类型Route::rule('test2', function () {return 'test2';});
postman 测试:
4.2.3 rule 限制请求类型一种
设置第三个参数就好了
<?php# 限制访问的请求类型为 post 请求Route::rule('test3', function () {return 'test3';}, 'post');
postman 测试:
4.2.4 路由绑定控制器
绑定控制器中的方法
<?php# 结合控制器使用Route::get('add/:no', 'index/goods/add');
Goods.php
<?phpnamespace app\index\controller;class Goods{// 默认方法public function index(){echo 'goods-index-function()';}// get 参数处理public function fun1($id = 0){dump($id);}// addpublic function add($no = 0){return ($no === 0) ? '没有传递参数:商品编号' : '需要添加的商品编号是:' . $no;}}
postman 测试:
使用rule也是一样的。
路由:
<?php# 不设置请求类型的限制Route::rule('add2/:no', 'index/goods/add');
控制器:
<?php// add2public function add2($no = 0){return 'in add2 需要添加的商品编号是:' . $no;}
postman 测试:
rule 绑定第三个参数
路由:
<?php# rule 设置请求类型限定Route::rule('add3/:no', 'index/goods/add3');
控制器:
<?php// add3public function add3($no = 0){return 'in add3 需要添加的商品编号是:' . $no;}
postman 测试:
4.2.5 rule 设置请求参数多种
<?php// 路由// 控制器
postman 测试:get 请求这个定义的路由规则
postman 测试:post 请求这个定义的路由规则
4.2.6 Route 快捷方法
这是使用更多的一种方式,如下面的代码
<?phpRoute::get('new/:id','News/read'); // 定义GET请求路由规则Route::post('new/:id','News/update'); // 定义POST请求路由规则Route::put('new/:id','News/update'); // 定义PUT请求路由规则Route::delete('new/:id','News/delete'); // 定义DELETE请求路由规则Route::any('new/:id','News/read'); // 所有请求都支持的路由规则
5. 路由表达式
路由表达式统一使字符串定义,采用规则定义的方式(不支持直接使用正则表达式,但支持给某个变量定义正则,参考后面的变量规则部分)。
5.1 规则表达式
规则表达式通常包含静态地址和动态地址,或者两种地址的结合,例如下面都属于有效的规则表达式:
<?phpRoute::rule('/', 'index'); // 首页访问路由Route::rule('my', 'Member/myinfo'); // 静态地址路由Route::rule('blog/:id', 'Blog/read'); // 静态地址和动态地址结合Route::rule('new/:year/:month/:day', 'News/read'); // 静态地址和动态地址结合Route::rule(':user/:blog_id', 'Blog/read'); // 全动态地址
6. 可选参数
- 和laravel 中稍有区别,这里使用 [$var] ,laravel {$var?},如果是可选的需要我设置一下默认值,需要注意和laravel一样可选参数只能放在参数的最后。
路由:
<?php# 可选参数Route::get('blog/:year/[:month]','Blog/archive');
控制器:
<?phpnamespace app\index\controller;class Blog{public function archive($year, $month = ''){return 'year:' . $year . ' month:' . $month;}}
postman 测试:只传递 year这个参数
postman 测试:传递两个参数
7. 完全匹配
demo 例子
<?php// 路由文件# 完全匹配route::get('new/:cate$', 'goods/buybook');// 控制器// buyBookpublic function buyBook($cate){return 'buyBook ' . $cate;}
OK:
Fail:
可以去配置文件中设置
<?php// 开启路由完全匹配'route_complete_match' => true,
8. 额外参数
使用的情况不多,一般都是考虑到安全问题。不在url中添加参数。而在路由定义的规则中添加参数
路由:
<?php# 额外参数Route::get('blog/:id', 'blog/read?status=1&app_id=5');
控制器:
<?phppublic function read(Request $req, $id){$status = request()->param('status');$app_id = request()->param('app_id');return "id = $id;status = $status; app_id = $app_id ";}
postman 测试:
9. 路由标识
和laravel中的差不多
<?php// 注册路由到index模块的News控制器的read操作Route::name('new_read')->rule('new/:id','index/News/read');
V5.1.6+版本开始,路由标识的用法调整,原来的用法:需要改为:
<?php// 注册路由到index模块的News控制器的read操作Route::rule('new/:id','index/News/read')->name('new_read');
