一、Route路由技术入门
1.路由定义文件
统一定义在route目录下,默认为route.php;
可以在该目录下设置多个路由文件,最终一起合并加载;
例如根据模块定义路由: route.php,index.php,admin.php,api.php…;
建议添加:use think\facade\Route;,不使用别名:Route,以获取IDE的代码提示;
2.路由定义的基本语法
Route::rule('路由表达式','路由地址','请求类型','路由参数','变量规则');
- 路由表达式: 用户输入的url地址,即自定义的路由规则;
- 路由地址: 实际转向的url地址;
- 请求类型: get/post/put/delete…,推荐直接使用快捷方法;
- 路由参数: 主要检测路由规则,推荐使用方法设置;
- 变量规则: url中的变量参数须遵守的规则,默认为:’\w+’,推荐使用方法设置;
3.路由定义的快捷方式
GET:
Route::get('路由表达式','路由地址');
Route::rule('路由表达式','路由地址')->method('get');
POST:
Route::post('路由表达式','路由地址');
Route::rule('路由表达式','路由地址')->method('post');
PUT:用于更新资源(不常用)
Route::put('路由表达式','路由地址');
Route::rule('路由表达式','路由地址')->method('put');
DELETE:用于删除资源(不常用)
Route::delete('路由表达式','路由地址');
Route::rule('路由表达式','路由地址')->method('delete');
4.路由表达式
静态表达式: 没有参数,例如: user;
动态表达式: 有参数,V5.1.6+ 推荐使用组合变量规则来定义;
user/hello: /分隔符可自定义,例如 user-hello 或者 user_hello都可以;
user/hello/<name>: ,<name>是必选变量;
user/hello/<name?>: <name?>是可选变量;
5.路由参数
路由参数很多,这里仅介绍几个常用的
method(): 请求类型;
ext(‘html’): url扩展名;
更多参数请访问: 路由参数
实例:
Route::rule('hello/<name?>', 'index/hello')
->method('get') // 请求类型
->ext('html'); // url后缀
6.变量规则
方法: pattern()
参数说明:
单个变量规则可用字符串: pattern('name', '\w+');
多个变量规则可用数组: pattern(['name' => '\w+','id' => '\d']);
实例:
Route::rule('hello/<name?>', 'index/hello')
->pattern('name','[a-z]{2,5}$') // 必须是小字字母且必须在2到5个之间
->method('get') // 请求类型
->ext('html'); // url后缀
7.别名路由
别名路由: 一条规则,批量对应一批路由地址;
别名路由: 通过只路由到控制器级别;
别名路由: 纯粹是为了缩短地址,注意与路由表达式的区别;
//可以用’p’,直接访问’index模块index控制器中的所有操作方法’
Route::alias(‘p’,‘index/index’);
8.URL生成
方法:
think\facade\Url::bild('地址表达式',['参数'],['URL后缀'],['域名'])
地址表达式: 与think\facade\Route::rule()中的路由地址保持一致;
默认生成的是: pathinfo 结构的 url地址;
配置项:‘url_common_param’=>true,则生成带查询字符串的url(参数以键值对方式提供)
例如:
/index.php/blog/5.html?name=thinkphp;
二、 tp51中的配置技巧
1.配置的类型
惯例配置: 位于核心框架内,不要去修改它;
应用配置: 针对应用的全局配置;
模块配置: 针对应用中的某个模块进行配置;
动态配置: 针对当前请求有效,在控制器操作中设置,不会保存到配置文件中;
2.配置的优先级
惯例配置->应用配置->模块配置->动态配置`
3.tp5.1配置的特点
全部采用二级配置,配置文件名为一级配置,例如应用配置文件app.php,app就是一级配置名称,内部键值对为二级配置;
每个模块也可以有自己的配置目录,所以用户可设置:应用配置和模块配置;
惯例配置文件: thinkphp/convention.php;
应用配置目录: /config/config_file;
模块配置目录: application/module/config/config_file;
也可以在应用配置目录中接管模块中的配置:config/module/config_file;
模块中的配置的优先级大于应用配置目录中的模块配置;
配置参数严格区分大小写,建议参数全部使用小写字母+下划线
4.只允许在应用配置中设置的参数
app_debug: 应用调试模式(支持环境变量配置)
app_trace: 应用trace(支持环境变量配置)
class_suffix: 类后缀
default_filter: 默认过滤机制
root_namespace: 根命名空间
pathinfo_depr: PATH_INFO分隔符
url_route_must: 路由强制模式
auto_bind_module: 自动绑定模块
default_lang: 默认语言
lang_switch_on: 多语言切换
5.只允许在环境变量中设置的参数
.env是环境变量配置文件,用来模拟环境变量,必须与application目录平级,即位于应用的根目录下面;
.env中的配置项优先级大于框架应用配置,一定要注意;
.env默认采用ini格式,例如:
有些配置仅允许在.env中设置
APP_NAMESPACE: 应用命名空间;
CONFIG_EXT: 配置文件后缀;
有一些应用配置项,强烈推荐设置在.env配置文件中;
常用的.env文件内容结构:
APP_DEBUG = true # 调试开关:
APP_TRACE = true # 跟踪器开关
[DATABASE] # 二级配置: 例如数据库配置
USERNAME = root # 数据库用户名
PASSWORD = 123456 # 用户密码
6.如果获取应用或模块配置参数?
类:
think\Config: 使用框架配置类;
think\facade\Config 或者别名 Config: 框架预定义的门面配置类(静态代理)或别名;
类方法:
pull(): 获取一级配置项;
has('一级配置.配置项'): 判断配置项是否存在;
get('一级配置.配置项'): 获取配置项,省略一级配置则获取它下面全部的配置顶;
set('一级配置.配置项','新值'): 设置配置顶;
助手函数: config(),无须引入Config,任何时候都可以直接使用,可能不会得到IDE的代码提示
在index模块中新建控制器:Demo1.php,用来学习配置相关的操作
7.实例演示: application/controller/Demo1.php
<?php
namespace app\index\controller;
use think\Config; //使用facade,必须将原始类空间引用语句注释掉
// use think\facade\Config; // 推荐使用门面代理
// 使用 think/facade/Config 的别名,来简化代码
// use Config;
use think\facade\Env;
class Demo1
{
// 将配置对象,以'依赖注入'的方式,通过参数注入到类方法中
function conf1(Config $config)
{
// has('一级配置名称.配置项'):判断是否存在指定配置项
// pull('一级配置名称'): 获取一级配置项
// get('一级配置名称.配置项'):获取配置项
// set('一级配置名称.配置项'):设置配置项
//查看默认返回的数据类型
//判断是否存在该配置项
if ($config->has('app.default_return_type')) {
dump($config->get('app.default_return_type'));
}
dump($config->get('app_debug')); // 'app_debug'在.env中设置,使用Env类获取,这里获取不到
//动态设置该配置项
$config->set('app.default_return_type','json');
dump($config->get('app.default_return_type'));
//获取一级配置项,例如:app.php
dump($config->pull('app'));
//get()方法省略配置项也可以获取一级配置
dump($config->get('app.')); // 注意一级配置名称后面的'.'不可以省略
}
//使用Config的门面静态代理
function conf2()
{
// 判断是否存在配置项
if (Config::has('app.default_return_type')) {
// 查询配置项
dump(Config::get('app.default_return_type'));
}
//设置配置项
Config::set('app.default_return_type','json');
dump(Config::get('app.default_return_type'));
//获取一级配置项
dump(Config::pull('app'));
dump(Config::get('app.'));
//get()不传参,获取到所有的配置项
dump(Config::get());
}
//使用助手函数config(),可以将前面的 use 语句全部注释掉
function conf3()
{
// 判断是否存在某配置项
if (config('?app.default_return_type')) {
// 获取配置顶
dump(config('app.default_return_type'));
}
//设置配置项
config('app.default_return_type','json');
dump(config('app.default_return_type'));
//获取一级配置项
dump(config('app.'));
//获取所有的配置项
dump(config());
}
function conf4()
{
// 环境变量获取时,配置名称不区分大小写
dump(Env::get('app_debug'));
dump(Env::get('database.username'));
}
}
三、tp51控制器Controller的使用方法
1.涉及控制器的配置项
应用配置文件(app.php);
// 默认的访问控制器层
'url_controller_layer' => 'controller',
// 默认模块名
'default_module' => 'index',
// 禁止访问模块
'deny_module_list' => ['common'],
// 默认控制器名
'default_controller' => 'Index',
// 默认操作名
'default_action' => 'index',
例如: application/index/controller/Index.php;
如果修改了controller目录名,则不能访问Index.php;
2.控制器命名规则
控制器是类文件,每个单词首字母必须大写,User;
url中忽略控制器名称大小写,多个单词之间用下划线进行连接,user_controller;
完整的控制器类名应该带有命名空间: app\index\controller\User;
3.控制器使用的注意事项
可以通过URL访问的控制器操作的访问属性必须是:public;
控制器的命名空间必须是:app根空间开始,如果想修改,必须在.env中设置;
APP_NAMESPACE = application;
控制器不依赖于基类think\Controller,推荐继承它,这样可以使用一些预置的属性和方法;
4.控制器前置操作
前置操作: 当前操作执行前,必须先执行的操作;控制器必须继承:think\Controller;
设置属性: protected $beforeActionList = […];;
属性数组键名: 前置操作方法名称;
属性数组键值:
空: 该操作是所有操作的前置操作;
[‘only’=>‘a,b’]: 所有操作中,仅有a 和 b 需要执行前置操作
演示代码:
<?php
namespace app\index\controller;
use think\Controller;
class Demo2 extends Controller
{
protected $beforeActionList = [
'a',
'b' => ['except' => 'x,y'],
'c' => ['only' => 'x']
];
// 设置三个前置操作: a,b,c
public function a()
{
echo '前置操作 a' . '<br>';
}
public function b()
{
echo '前置操作 b'. '<br>';
}
public function c()
{
echo '前置操作 c'. '<br>';
}
public function x()
{
return '操作 x';
}
public function y()
{
return '操作 y';
}
}
执行x操作: http://tp51.io/index/demo2/x
经过分析,x的前置是a,c,b被排除
前置操作 a
前置操作 c
操作 x
执行y操作:http://tp51.io/index/demo2/y
经过分析: 只会执行前置操作 a
前置操作 a
操作 y
5.使用命令行生成控制器:
必须先切换到当前项目目录下面: tp51 ;
命令: php think make:controller index/Demo3
解释: 在index模块下面创建Demo3控制器
生成的控制器以及内部的预置代码如下:
<?php
namespace app\index\controller;
use think\Controller;
use think\Request;
class Demo3 extends Controller
{
/**
* 显示资源列表
*
* @return \think\Response
*/
public function index()
{
//
}
/**
* 显示创建资源表单页.
*
* @return \think\Response
*/
public function create()
{
//
}
/**
* 保存新建的资源
*
* @param \think\Request $request
* @return \think\Response
*/
public function save(Request $request)
{
//
}
/**
* 显示指定的资源
*
* @param int $id
* @return \think\Response
*/
public function read($id)
{
//
}
/**
* 显示编辑资源表单页.
*
* @param int $id
* @return \think\Response
*/
public function edit($id)
{
//
}
/**
* 保存更新的资源
*
* @param \think\Request $request
* @param int $id
* @return \think\Response
*/
public function update(Request $request, $id)
{
//
}
/**
* 删除指定资源
*
* @param int $id
* @return \think\Response
*/
public function delete($id)
{
//
}
}
6.页面跳转与重定向:
控制器必须继承:think\Controller;
跳转内置方法:
$this->success(‘提示信息’,‘跳转地址’,‘等待时间’): 成功跳转,默认为$_SERVER[“HTTP_REFERER”];
$this->erroe(‘提示信息’,‘跳转地址’,‘等待时间’): 成功跳转,默认为javascript:history.back(-1);
等待时间默认为3秒,可以自定义;
跳转页面模板都一样: thinkphp/tpl/dispatch_jump.tpl
应用配置中可以改变默认的模板:
//默认错误跳转对应的模板文件
'dispatch_error_tmpl' => '../application/tpl/dispatch_jump.tpl',
//默认成功跳转对应的模板文件
'dispatch_success_tmpl' => '../application/tpl/dispatch_jump.tpl',
也可以使用项目内部的模板文件
//默认错误跳转对应的模板文件
'dispatch_error_tmpl' => 'public/error',
//默认成功跳转对应的模板文件
'dispatch_success_tmpl' => 'public/success',
重定向: $this->redirect('重定向的地址表达式', '重定向类型')
重定向地址: 与路由表达式中的路由地址对应;
重定向类型:
301: 永久重定向,不常用
302: 临时重定向,最常用
redirect('http://thinkphp.cn/blog/2',302);
//重定向到指定的URL地址 并且使用302
$this->redirect('http://thinkphp.cn/blog/2',302);
// 可以在重定向的时候通过session闪存数据传值,例如
$this->redirect('News/category', ['cate_id' => 2], 302, ['data' => 'hello']);
本文详细介绍了ThinkPhp5.1的Route路由技术,包括路由定义文件、基本语法、快捷方式、路由参数和控制器的使用方法。同时,探讨了tp51中的配置技巧,如配置类型、优先级、特点以及如何获取应用或模块配置参数。通过对控制器的命名规则、前置操作、命令行生成控制器和页面跳转的理解,加深对ThinkPhp5.1框架的掌握。
997

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



