3.Thinkphp的路由

Posted 余生随缘~~

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了3.Thinkphp的路由相关的知识,希望对你有一定的参考价值。

路由简介

什么是路由?

将用户的请求按照事先规划的方案提交给指定的 控制器 和 方法来进行处理。

Thinkphp框架提供了两种路由规则

Ø pathinfo模式

pathinfo 方式路由
pathinfo:即全路径的访问控制器方法,如:域名/模块/控制器/方法

pathinfo 方式路由示例
// index模块下index控制器index方法
tp5.com/index/index/index

Ø 自定义路由规则【推荐】

进而可以让URL更规范以及优雅,提高网站的安全和网站URL访问的友好度。

Route类注册使用think\\facade\\Route类静态调用 think\\Route.php

注:ThinkPHP5.1的路由定义更加对象化,并且默认开启路由(不能关闭),如果一个URL没有定义路由,则采用默认的PATH_INFO 模式访问URL。

隐藏index.php文件

为什么要配置隐藏index.php

Thinkphp在pubilc文件夹下的.htaccess文件中已经默认配置了重写

.htaccess文件内容如下

<IfModule mod_rewrite.c>
  Options +FollowSymlinks -Multiviews
  RewriteEngine On

  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
  #如果重写不生效是可以将RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L] 这行注释,使用下面这个试试,这个表示兼容模式
  #RewriteRule ^(.*)$ index.php?/$1 [QSA,PT,L]
</IfModule>

那我们访问的路由应该可以写http://www.tp5.com/index/index/,用浏览器访问会发现访问错误404,说明重写失败

image-20200520221304348

那我们应该如何访问呢?应该使用这个http://www.tp5.com/index.php/index/index/访问

image-20200520221448332

细心的你会发现中间多了一层index.php,那么我们可以将这个给隐藏吗,也就是让重写生效?答案是可以的

配置重写,隐藏index.php文件

1.打开apache重写模块

找到apachehttpd.conf文件搜索rewriteLoadModule rewrite_module modules/mod_rewrite.so前面的#号去掉

image-20200520222407575

2.配置虚拟主机中允许重写

找到虚拟主机配置文件按下图方式设置

image-20200520223219305

在入口文件中要有.htaccess文件

image-20200520224419176

重启apache服务,让配置生效。访问时就可以不用带index.php文件了。

路由常用配置

强制路由

config/app.php配置文件中设置

\'url_route_must\'  =>  true,
注:将开启强制使用路由,这种方式下面必须严格给每一个访问地址定义路由规则(包括首页),否则将抛出异常。

路由缓存

对于路由规则较多的应用可以大幅提升路由性能(仅部署模式有效)

\'route_check_cache\'	=> true,
注:如果路由定义中,有某个路由规则的路由地址使用了闭包的方式,那么路由缓存将会失效。

完全匹配

\'route_complete_match\'   => true,

123

自定义路由

路由如何定义

路由文件的位置:项目目录/routes/route.php文件中进行如下格式的定义

Route::请求方式(\'路由表达式\',匿名函数);
或者
Route::请求方式(\'路由表达式\',\'[@]模块名/控制器名/方法名\'); 

注:给控制器方法设置好了请求的路由规则后,原来的pathinfo请求则失效,请求就会报异常,只能通过自定义路由规则来请求

例:

定义一个跟路由并使用匿名函数输出hello world ruote...

写法如下:

<?php
use think\\facade\\Route;

route::get(\'/\', function (){
    return \'hello world ruote...\';
});

image-20200521152844273

路由请求类型

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\'); 		// 所有请求都支持的路由规则  框架提供 不推荐

例:
image-20200521154053161

测试定义好的请求路由规则类型,使用postman软件来测试

image-20200521154241341

路由参数

路由参数分类

路由参数分为下面两种:

# 必填参数
Route::请求方式(\'路由表达式/:参数\',匿名函数);
# 可选参数
Route::请求方式(\'路由表达式/[:参数]\',匿名函数);

必填参数的参数必须填,可选参数的参数值可写可不填

形参名和参数名必须保持一致否则会报错

必填参数示例:
Route::get(\'/dd/:id\', function ($id){
    return \'你输入的参数值为:\'.$id;
});

运行结果:

image-20200521155643796

可选参数示例:
Route::get(\'/dd/[:id]\', function ($id = 0){
    return \'你输入的参数值为:\'.$id;
});

注意:可选参数设置时,如果要获取参数则需要在形参出设置默认值

运行结果:

image-20200521161745604

路由参数类型的限制

为什么要对路由参数的类型进行限制?因为可以提高效率,官方给出的数据是比不限制的快4倍

方式一:标量限定

标量限定时php7提供的,所以要想使用必须保证本地环境是php7以上

Route::get(\'/dd/:id\', function (int $id){
    return \'你输入的参数值为:\'.$id;
});

image-20200521163517683

方式二:正则表达式限定

例:

Route::get(\'/dd/:id\', function ($id){
    return \'你输入的参数值为:\'.$id;
})->pattern([\'id\' => \'\\d+\']);

image-20200521164227364

传入多个参数并限定

例:

Route::get(\'/dd/:id/:name\', function ($id,$name){
    return \'你输入的参数值为:\'.$id.$name;

})->pattern([\'id\' => \'\\d+\']);

运行结果

image-20200521164824708

路由分组基本使用

路由分组功能允许把相同前缀的路由定义合并分组,这样可以简化路由定义,并且提高路由匹配的效率,不必每次都去遍历完整的路由规则(尤其是开启了路由延迟解析后性能更佳)。

使用Route类的group方法进行注册,给分组路由定义一些公用的路由设置参数,使用规范如下:

Route::group(\'分组名(字符串)或者分组路由参数(数组)\',\'分组路由规则(数组或者闭包)\');

格式示例:

Route::group(\'blog\', function () {
    Route::get(\':id\', \'read\');
    Route::post(\':id\', \'update\');
    Route::delete(\':id\', \'delete\');
})->pattern([\'id\' => \'\\d+\']);


# 分组的嵌套
Route::group([\'method\'=>\'get\'], function () {
    Route::group(\'blog\',function(){
            Route::get(\':id\', \'read\');
            Route::post(\':id\', \'update\');
            Route::delete(\':id\', \'delete\');
    });
})->pattern([\'id\' => \'\\d+\']);

单个分组示例

//路由分组
Route::group(\'bolg\',function (){
    Route::get(\'index\',function (){
       return \'index\';
    });
});

image-20200521172504039

分组嵌套示例

/**
 * admin/login
 * admin/welcome
 */
Route::group([\'method\'=>\'get\'], function () {
    Route::group(\'admin\',function(){
        Route::get(\'login\',function (){
            return \'route long\';
        });
        Route::get(\'welcome\',function (){
            return \'route welcome\';
        });
        Route::post(\'login\',function (){
            return \'route long\';
        });
    });
})->pattern([\'id\' => \'\\d+\']);

image-20200521172709036

查看已定义的路由列表

php think route:list   #查看已定义的路由列表

路由分模块(文件)

在公共函数文件中定义找到route文件夹的路径函数

//找到route文件夹
function route_path(){
    return dirname(__DIR__).DIRECTORY_SEPARATOR.\'route\';
}

route文件夹下创建文件夹(模块名),写入路由规则

例:

/route/admin/admin.php

<?php
use \\think\\facade\\Route;
Route::group(\'admin\', function (){
    Route::get(\'login\', \'@admin/login/index\')->name(\'login\');
    Route::post(\'loginSubmi\', \'@admin/login/loginSubmi\')->name(\'loginSubmi\');
});

route文件夹根目录的route.php,里引入该文件

include route_path().\'/admin/admin.php\';

如图

image-20200530164132022

以上是关于3.Thinkphp的路由的主要内容,如果未能解决你的问题,请参考以下文章

VSCode自定义代码片段11——vue路由的配置

VSCode自定义代码片段11——vue路由的配置

ThinkPHP框架系统源码解析——URL路由解析

Express实战 - 应用案例- realworld-API - 路由设计 - mongoose - 数据验证 - 密码加密 - 登录接口 - 身份认证 - token - 增删改查API(代码片段

导致资产预编译在heroku部署上失败的代码片段

滚动经过片段时,Angular 10会获得路由器活动片段吗?