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
<?php
Route::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
<?php
namespace app\index\controller;
class Goods
{
// 默认方法
public function index()
{
echo 'goods-index-function()';
}
// get 参数处理
public function fun1($id = 0)
{
dump($id);
}
// add
public function add($no = 0)
{
return ($no === 0) ? '没有传递参数:商品编号' : '需要添加的商品编号是:' . $no;
}
}
postman 测试:
使用rule也是一样的。
路由:
<?php
# 不设置请求类型的限制
Route::rule('add2/:no', 'index/goods/add');
控制器:
<?php
// add2
public function add2($no = 0)
{
return 'in add2 需要添加的商品编号是:' . $no;
}
postman 测试:
rule 绑定第三个参数
路由:
<?php
# rule 设置请求类型限定
Route::rule('add3/:no', 'index/goods/add3');
控制器:
<?php
// add3
public function add3($no = 0)
{
return 'in add3 需要添加的商品编号是:' . $no;
}
postman 测试:
4.2.5 rule 设置请求参数多种
<?php
// 路由
// 控制器
postman 测试:get 请求这个定义的路由规则
postman 测试:post 请求这个定义的路由规则
4.2.6 Route 快捷方法
这是使用更多的一种方式,如下面的代码
<?php
Route::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 规则表达式
规则表达式通常包含静态地址和动态地址,或者两种地址的结合,例如下面都属于有效的规则表达式:
<?php
Route::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');
控制器:
<?php
namespace 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');
// 控制器
// buyBook
public 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');
控制器:
<?php
public 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');