thinkphp6路由器详解
路由配置文件

所有的路由规则都在这个文件中配置
注册路由到控制器中到方法
在路由文件中定义规则
// 路由到Qipa控制器 ,且定义变量名称为id,在控制器read方法中接受时需保持一致
Route::rule('qipa/:id','qipa/read');
qipa控制器文件代码

<?php
namespace app\controller;
use app\BaseController;
class Qipa extends BaseController
{
public function index()
{
return '我是奇葩控制器';
}
public function hello($name = 'ThinkPHP6')
{
return 'hello,' . $name;
}
//与路由规则中定义的变量名称保持一致,否则接受不到
public function read($id)
{
return 'www.qipa250.com-read-id=' .$id;
}
}
访问:http://mac.tp6.com/qipa/888

控制器中接受参数
// 路由到Qipa控制器read2方法
Route::rule('qipa/:id','qipa/read2');
qipa控制器中定义read2方法
//一定要引入reques否则不能使用
use think\facade\Request;
public function read2()
{
echo 'read2-id:'.Request::param('id');
}

定义路由请求为get或post
// 路由到Qipa控制器 定义为get请求
Route::rule('qipa/:id','qipa/read','GET');

若是修改为post请求
// 路由到Qipa控制器 定义为post请求
Route::rule('qipa/:id','qipa/read','POST');
在浏览器中get请求访问时报错:

直接定义为get请求,将rule替换为get即可
// 路由到Qipa控制器 定义为get请求
Route::get('qipa/:id','qipa/read');
同样定义为post请求
Route::post('qipa/:id','qipa/read');
在浏览器中访问则会报错,因为不是post请求

路由规则设置可选参数
原路由规则设定参数为必填项
// 路由到Qipa控制器 定义为get请求
Route::get('read/:id','qipa/read2');
若是不传参数,则会报错:

因为定义的id为必填参数
修改为可选参数:
// 路由到Qipa控制器 定义为get请求
Route::get('read/[:id]','qipa/read2');
在浏览器中不加入id参数,访问:

传入id的值

完全匹配
在浏览器中增加访问,如下:
http://mac.tp6.com/read/250/hhh/bbb

会发现可以一直增加变量,我们需要修改规则为完全匹配,以id变量的值为结尾,在输入则报错:
Route::get('read/:id$','qipa/read2');

去掉多余参数,访问就正常了

额外参数
修改路由规则,增加额外参数,并且不用在浏览器中显示,直接传给qipa控制器中的read2方法
Route::get('read/:id','qipa/read2')->append(['url'=>'www.qipa250.com','name'=>'奇葩天地网']);
修改控制器的read2方法
public function read2()
{
$params= Request::param();
halt($params);
}
访问效果如下:

路由标识name
路由规则定义name别名为read_info
Route::get('read/:id','qipa/read')->name('read_info');
qipa控制器中的两个方法
public function read($id)
{
echo 'www.qipa250.com-read-id=' . $id;
}
public function read2()
{
echo url('read_info',['id'=>250]);
echo '<br>';
echo url('qipa/read',['id'=>888]);
}
当我们在浏览器中访问read2时,可以看到

得到优化后到页面路径,我们分别访问:


路由设置变量规则
在配置文件中设置变量规则

// 默认的路由变量规则
//'default_route_pattern' => '[\w\.]+',
//默认的路由变量规则以数字结尾 只传入数字,并且为一次以上
'default_route_pattern' => '[\d\.]+',
我们在浏览器中访问:http://mac.tp6.com/read/250com

发现250后边到com没有了,是因为只允许输入数字,将其他过滤掉了
若是开启默认到变量规则,不限制
'default_route_pattern' => '[\w\.]+',
则会将com也打印出来

局部变量规则
将配置文件中的规则屏蔽
// 默认的路由变量规则
//'default_route_pattern' => '[\w\.]+',
//默认的路由变量规则以数字结尾
//'default_route_pattern' => '[\d\.]+',//只传入数字,并且为一次以上
在路由app.php文件中中针对不同的路由设置局部规则
Route::get('read/:id','qipa/read')->pattern(['id'=>'[\d]+']);

修改为
Route::get('read/:id','qipa/read')->pattern(['id'=>'[\w]+']);

加一个横杠
Route::get('read/:id','qipa/read')->pattern(['id'=>'[\w\-]+']);

全局变量规则
//设置全局变量规则
Route::pattern([
'id'=>'\d+',
'name'=>'[a-zA-Z]+'
]);
// 路由到Qipa控制器 定义为get请求
Route::get('read/:id','qipa/read');
// 路由到Qipa控制器 定义为get请求
Route::get('readbook/:name','qipa/readbook');
Qipa控制器
public function read($id)
{
echo 'www.qipa250.com-read-id=' . $id;
}
public function readbook()
{
halt(Request::param());
}
访问read

访问readbook,传入250数字,则报错

传入字母,则显示正常

组合变量
Route::get('read-<name>-<id>','qipa/readbook')->pattern(['name'=>'[a-zA-Z]+','id'=>'\d+']);
http://mac.tp6.com/read-qipa-250

http://mac.tp6.com/read-888-250

动态路由
动态路由,会将参数传递给控制器,并执行控制器中对应的方法
// 动态路由
Route::get('zhixing-<name>-<id>', 'qipa/:name')
->pattern(['name' => '[a-zA-Z]+', 'id' => '\d+']);
访问 http://mac.tp6.com/zhixing-readbook-250

http://mac.tp6.com/zhixing-read-250

也可以修改为,调用指定控制器的指定方法
// 动态路由
Route::get('zhixing-<control>-<name>-<id>', ':control/:name')
->pattern(['name' => '[a-zA-Z]+', 'id' => '\d+']);
http://mac.tp6.com/zhixing-qipa-read-250

http://mac.tp6.com/zhixing-qipa-readbook-250

路由到控制器
Route::get('qipa/:id', 'qipa/read');

action变量值作为操作方法传入
Route::get(':action/qipa/:id', 'qipa/:action');
将readbook作为action到值传入,就会访问qipa控制器中到readbook方法
http://mac.tp6.com/readbook/qipa/250

将read作为action到值传入,就会访问qipa控制器中到read方法
http://mac.tp6.com/read/qipa/250

路由到指定类到指定方法中
新建类文件,在

<?php
namespace app\server;
use think\facade\Request;
class News
{
public function read()
{
return 'read文章ID:' . Request::param('id');
}
public static function readbook()
{
$news_id = Request::param('id');
return 'readbook文章ID:' . $news_id;
}
}
定义路由
Route::get('new/:id', '\app\server\News@read');
http://mac.tp6.com/new/250

调用类到静态方法
Route::get('new/:id', '\app\server\News::readbook');
http://mac.tp6.com/new/250

路由跳转
//跳转到指定页面,并传递参数
Route::redirect('read/:id', 'http://mac.tp6.com/index.php/qipa/qiparead?id=:id','302');
qipa控制器增加qiparead方法
public function qiparead()
{
echo 'www.qipa250.com-qiparead-id=' . $_GET['id'];
}
访问http://mac.tp6.com/read/250 跳转到http://mac.tp6.com/index.php/qipa/qiparead?id=250 状态码为302

路由到模版文件
路由到模板
支持路由直接渲染模板输出。
// 路由到模板文件
Route::view('hello/:name', 'index/hello');
表示该路由会渲染当前应用下面的view/index/hello.html模板文件输出。
模板文件中可以直接输出当前请求的param变量,如果需要增加额外的模板变量,可以使用:
Route::view('hello/:name', 'index/hello', ['city'=>'shanghai']);
在模板中可以输出name和city两个变量。
Hello,{$name}--{$city}!
若是报错:

需要在根目录:
composer输入
composer require topthink/think-view
并赋予777权限,否则会报错:
mkdir(): Permission denied

本文详细介绍了ThinkPHP6的路由配置,包括路由规则、请求类型、可选参数、完全匹配、额外参数、路由标识、变量规则、局部与全局变量、动态路由、路由到控制器及方法、路由跳转和模板文件渲染等核心概念,通过实例解析帮助开发者更好地理解和应用路由功能。
1141

被折叠的 条评论
为什么被折叠?



