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 文件中 添加方法,我在方法中绑定了一个默认的参数

  1. <?php
  2. // get 参数处理
  3. public function fun1($id = 0)
  4. {
  5. dump($id);
  6. }

不添加参数访问,将会使用默认设置的参数
image.png

添加参数访问,将会使用我设置的 url 中传递的参数。只需要 方法名称/参数名称/参数值
image.png


3. nginx 下隐藏入口文件

只需要修改 nginx 下的入口文件就好,需要我自己根据这个练习项目单独配置一个 server 配置,其中Line11 的 if 判断开始,起到关键作用。

  1. ## 本地练习使用
  2. server {
  3. listen 80;
  4. root "F:/phpStudy_2016/WWW/tp5.1/public";
  5. server_name tp5.1.com;
  6. location / {
  7. index index.html index.htm index.php;
  8. autoindex on;
  9. # 起作用的在这里
  10. if (!-e $request_filename) {
  11. rewrite ^(.*)$ /index.php?s=/$1 last;
  12. break;
  13. }
  14. }
  15. location ~ \.php(.*)$ {
  16. fastcgi_pass 127.0.0.1:9000;
  17. fastcgi_index index.php;
  18. fastcgi_split_path_info ^((?U).+\.php)(/?.+)$;
  19. fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
  20. fastcgi_param PATH_INFO $fastcgi_path_info;
  21. fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
  22. include fastcgi_params;
  23. include fastcgi.conf;
  24. }
  25. location ~ .*\.(css|js|gif|jpg|jpeg|png|bmp|swf)$ {
  26. root "F:/phpStudy_2016/WWW/tp5.1/public";
  27. expires 30d;
  28. }
  29. }

修改后的效果,如下图:现在不需要 在tp5.1.com 的后面 添加 /index.php 这个入口文件了
image.png


4. 路由定义

4.1 查看系统默认的路由文件

  • 注意1: 在Tp5里面,路由并不是必须的,不使用路由的情况下,照样可以使用pathinfo的方式进行访问。
    • 例如:域名/[index.php入口文件]/index模块名称/index控制器名称/lst方法名称/get参数
  • 注意2:也可以开始Tp5的路由和pathinfo同时一起使用。修改配置文件进行开启
    • app/下的config.php 中配置相关的规则

查看系统默认的路由文件 route\route.php

  1. <?php
  2. Route::get('think', function () {
  3. return 'hello,ThinkPHP5!';
  4. });
  5. Route::get('hello/:name', 'index/hello');

按照系统定义的方式,先去访问一下。

访问定义的第一个路由规则
image.png

访问定义的第二个路由规则
image.png

4.2 自定义路由规则

先创建一个自定义的路由规则文件,位置 route\myRoute.php , 不像 laravel 一样 tp5.1中不需要我们再去手动的注册路由。直接在 route 目录下定义的php文件就行

4.2.1 闭包

不经过控制器,直接从路由规则文件中返回响应。也就是通过以一个闭包返回响应。在刚刚创建的文件中添加下列代码

  1. <?php
  2. /**
  3. * 这是一个自定义的 路由定义文件
  4. */
  5. Route::get('test1', function () {
  6. return 'test1';
  7. });
  8. return [
  9. ];

postman 测试一下:
image.png

4.2.2 rule 不限制请求的类型

使用 Route::rule() 不使用第三个参数,就不会限制请求的类型。如下面的代码,测试时使用 put 请求

  1. <?php
  2. # 不限制访问的请求类型
  3. Route::rule('test2', function () {
  4. return 'test2';
  5. });

postman 测试:
image.png

4.2.3 rule 限制请求类型一种

设置第三个参数就好了

  1. <?php
  2. # 限制访问的请求类型为 post 请求
  3. Route::rule('test3', function () {
  4. return 'test3';
  5. }, 'post');

postman 测试:
image.png

4.2.4 路由绑定控制器

绑定控制器中的方法

  1. <?php
  2. # 结合控制器使用
  3. Route::get('add/:no', 'index/goods/add');

Goods.php

  1. <?php
  2. namespace app\index\controller;
  3. class Goods
  4. {
  5. // 默认方法
  6. public function index()
  7. {
  8. echo 'goods-index-function()';
  9. }
  10. // get 参数处理
  11. public function fun1($id = 0)
  12. {
  13. dump($id);
  14. }
  15. // add
  16. public function add($no = 0)
  17. {
  18. return ($no === 0) ? '没有传递参数:商品编号' : '需要添加的商品编号是:' . $no;
  19. }
  20. }

postman 测试:
image.png

使用rule也是一样的。

路由:

  1. <?php
  2. # 不设置请求类型的限制
  3. Route::rule('add2/:no', 'index/goods/add');

控制器:

  1. <?php
  2. // add2
  3. public function add2($no = 0)
  4. {
  5. return 'in add2 需要添加的商品编号是:' . $no;
  6. }

postman 测试:
image.png

rule 绑定第三个参数

路由:

  1. <?php
  2. # rule 设置请求类型限定
  3. Route::rule('add3/:no', 'index/goods/add3');

控制器:

  1. <?php
  2. // add3
  3. public function add3($no = 0)
  4. {
  5. return 'in add3 需要添加的商品编号是:' . $no;
  6. }

postman 测试:
image.png

4.2.5 rule 设置请求参数多种

  1. <?php
  2. // 路由
  3. // 控制器

postman 测试:get 请求这个定义的路由规则
image.png

postman 测试:post 请求这个定义的路由规则
image.png

4.2.6 Route 快捷方法

这是使用更多的一种方式,如下面的代码

  1. <?php
  2. Route::get('new/:id','News/read'); // 定义GET请求路由规则
  3. Route::post('new/:id','News/update'); // 定义POST请求路由规则
  4. Route::put('new/:id','News/update'); // 定义PUT请求路由规则
  5. Route::delete('new/:id','News/delete'); // 定义DELETE请求路由规则
  6. Route::any('new/:id','News/read'); // 所有请求都支持的路由规则

5. 路由表达式

路由表达式统一使字符串定义,采用规则定义的方式(不支持直接使用正则表达式,但支持给某个变量定义正则,参考后面的变量规则部分)。

5.1 规则表达式

规则表达式通常包含静态地址和动态地址,或者两种地址的结合,例如下面都属于有效的规则表达式:

  1. <?php
  2. Route::rule('/', 'index'); // 首页访问路由
  3. Route::rule('my', 'Member/myinfo'); // 静态地址路由
  4. Route::rule('blog/:id', 'Blog/read'); // 静态地址和动态地址结合
  5. Route::rule('new/:year/:month/:day', 'News/read'); // 静态地址和动态地址结合
  6. Route::rule(':user/:blog_id', 'Blog/read'); // 全动态地址

6. 可选参数

  • 和laravel 中稍有区别,这里使用 [$var] ,laravel {$var?},如果是可选的需要我设置一下默认值,需要注意和laravel一样可选参数只能放在参数的最后。

路由:

  1. <?php
  2. # 可选参数
  3. Route::get('blog/:year/[:month]','Blog/archive');

控制器:

  1. <?php
  2. namespace app\index\controller;
  3. class Blog
  4. {
  5. public function archive($year, $month = '')
  6. {
  7. return 'year:' . $year . ' month:' . $month;
  8. }
  9. }

postman 测试:只传递 year这个参数
image.png

postman 测试:传递两个参数
image.png


7. 完全匹配

demo 例子

  1. <?php
  2. // 路由文件
  3. # 完全匹配
  4. route::get('new/:cate$', 'goods/buybook');
  5. // 控制器
  6. // buyBook
  7. public function buyBook($cate)
  8. {
  9. return 'buyBook ' . $cate;
  10. }

OK:
image.png

Fail:
image.png

可以去配置文件中设置

  1. <?php
  2. // 开启路由完全匹配
  3. 'route_complete_match' => true,

8. 额外参数

使用的情况不多,一般都是考虑到安全问题。不在url中添加参数。而在路由定义的规则中添加参数

路由:

  1. <?php
  2. # 额外参数
  3. Route::get('blog/:id', 'blog/read?status=1&app_id=5');

控制器:

  1. <?php
  2. public function read(Request $req, $id)
  3. {
  4. $status = request()->param('status');
  5. $app_id = request()->param('app_id');
  6. return "id = $id;status = $status; app_id = $app_id ";
  7. }

postman 测试:
image.png


9. 路由标识

和laravel中的差不多

  1. <?php
  2. // 注册路由到index模块的News控制器的read操作
  3. Route::name('new_read')->rule('new/:id','index/News/read');

V5.1.6+版本开始,路由标识的用法调整,原来的用法:需要改为:

  1. <?php
  2. // 注册路由到index模块的News控制器的read操作
  3. Route::rule('new/:id','index/News/read')->name('new_read');