控制器验证
响应
Controller 基类继承引用
通过继承 BaseController 基类,注入 app 以及 request
本文仅举两个浅显的调用例子
1.获取当前操作名 $action = $this->request->action();
2.获取当前应用基础目录 $path = $this->app->getBasePath();
简易代码 ↓
<?php
namespace app\index\controller;
use app\BaseController;
class Index extends BaseController
{
public function index()
{
//获取当前操作名
echo $action = $this->request->action();
echo '<br>获取当前操作名代码 :$action = $this->request->action();<br> ';
// 获取当前应用基础目录
echo $path = $this->app->getBasePath();
echo '<br>获取当前应用基础目录 :$path = $this->app->getBasePath();<br> ';
echo "以上两个调用 request app 均通过基类 BaseController.php 注入<br>";
echo "只需继承 BaseController 类即可调用";
}
}
注意:
如果你是多应用模式,可以在 应用目录下同样创建一个 BaseController.php 基类文件
ThinkPHP 6 在寻址的时候,优先就近原则。
控制器验证
参考资料:TP6 官方内置规则
1.通过引用 validate 函数直接在控制器中使用
Validate(规则,返回提示)->check(数据)
这个简单,就不做过多介绍
<?php
namespace app\index\controller;
class Validate
{
public function index ()
{
//定义验证规则
$rule = [
'name' => "require|max:10",
'email' => "email"
];
// 定义错误返回信息
$message = [
"name" => ["require" => '名称不能为空','max' => '名称最大长度为10'],
'email' => '邮箱格式错误'
];
// 定义模拟数据
$data = [
'name' => 'Cry',
'email' => 'snail@qq.com'
];
// 验证规则
// Validate(规则,返回提示)->check(数据)
$result = Validate($rule,$message)->check($data);
if(!$result){
// 获取报错数据
return Validate()->getError();
}else{
return '验证通过';
}
}
}
2.通过引用 validate 对象直接在控制器中使用
继承基类 BaseController 类
$this->validate(数据,验证规则,返回提示);
<?php
namespace app\index\controller;
use app\BaseController;
class Validate extends BaseController
{
public function index ()
{
//定义验证规则
$rule = [
'name' => "require|max:10",
'email' => "email"
];
// 定义错误返回信息
$message = [
"name" => ["require" => '名称不能为空','max' => '名称最大长度为10'],
'email' => '邮箱格式错误'
];
// 定义模拟数据
$data = [
'name' => 'Cry',
'email' => 'snail@qq.com'
];
// 验证规则
$result = $this->validate($data,$rule,$message);
if(!$result){
// 获取报错数据
return Validate()->getError();
}else{
return '验证通过';
}
}
}
3.自定义验证规则
验证下图要求(均使用 ThinkPHP6 内置规则)
1.需要额外创建一个验证文件
在 app 目录下创建 validate 文件夹,然后创建 User.php 文件作为自定义规则文件。
目录:app\validate\User .php 代码如下 ↓
注意代码格式,不需要创建方法,直接写验证规则和验证返回即可
用 protected 声明
rule 验证变量,message 返回变量
<?php
namespace app\validate;
use think\Validate;
class User extends Validate
{
protected $rule = [
'user_name' => 'require|chsAlphaNum|length:6,10',
'password' => 'require|alphaNum|length:6,10',
'email' => 'email',
'mobile' => 'require|mobile|number|length:11'
];
protected $message = [
'user_name' => ['require' => '用户名不能为空','chsAlphaNum' => '用户名必须为字母和数字或汉字','length' => '用户名长度应在6至10位'],
'password' => ['require' => '密码不能为空','alphaNum' => '密码必须为数字和字母组合','length' => '密码长度应在6至10位'],
'email' => ['email' => '邮箱格式有误'],
'mobile' => ['require' => '手机不能为空','number' => '手机号必须为数字','length' => '手机号长度必须11位','mobile' => '不是可用手机号']
];
}
2.在 app\index\controller\Index.php 下调用
引入 User.php ,具体代码如下 ↓
<?php
namespace app\index\controller;
use app\BaseController;
use app\validate\User;
class Index extends BaseController
{
public function index()
{
$data = [
'user_name' => 'Cry666超帅的',
'password' => '123456qwe',
'email' => 'snail@qq.com',
'mobile' => '13112121211'
];
$result = Validate(User::class)->check($data);
if(!$result){
// 获取报错数据
return Validate()->getError();
}else{
return '验证通过';
}
}
}
响应
参考资料:TP6 官方响应输出
除了路由,需要注意的可能就是重定向了
1.重定向
参考资料:TP6 官方重定向
只需要调用 redirect(URL) 助手函数 即可
上一个官方例子代码,例子将直接跳转到TP 官网↓
<?php
namespace app\controller;
class Index
{
public function hello()
{
return redirect('http://www.thinkphp.cn');
}
}
个人例子
app/index/controller/Index.php 代码↓
public function dome($name = 'Cry')
{
return "hello ,". $name ."! 这是重定向后的 dome 页面";
}
public function name()
{
// 直接无传值定向
// return redirect("index/index/dome");
return redirect("dome");
}
打开后页面显示结果 ↓
2.重定向传值
public function dome($name = 'Cry')
{
return "hello ,". $name ."! 这是重定向后的 dome 页面";
}
public function name()
{
// 直接传值定向
// 1.直接在上拼接
// return redirect("index/index/dome?name=Snail");
// 或者用 TP 分隔符 / 进行传值
// return redirect("index/index/dome/name/Snail");
// 2.使用 params 助手函数配合
// return redirect('dome')->params(['name'=>'Snail']);
// 3.直接传递数组,推荐
return redirect('dome',['name'=>'Snail']);
}
访问结果↓
注意:同命名空间下,可以省略详细路径!
3.重定向利用 session 闪存数据
闪存、回源,需要借助 session 实现,TP6默认不开启 session
开启方法:把 app/middlware.php 下的 session 初始化注释删除即可 ↓
<?php
return [
// 全局请求缓存
// 'think\middleware\CheckRequestCache',
// 多语言加载
// 'think\middleware\LoadLangPack',
// Session初始化
'think\middleware\SessionInit',
// 页面Trace调试
// 'think\middleware\TraceDebug',
];
闪存数据需要借助 with(变量名,变量值) 方法,写入到 session 缓存 代码如下 ↓
public function dome()
{
//利用session 助手函数 调用
$name = session('name');
return "hello ,". $name ."! 这是重定向后的 dome 页面";
}
public function name()
{
return redirect('dome')->with("name","Snail");
}
注意事项:重定向目标页面如果手动刷新,将会丢失session 传递值。
图一:
图二:
重定向回源利用 remember() 方法记住重定向来源页
//重定向指向
public function dome()
{
//利用session 助手函数 调用
$name = session('name');
return "hello ,". $name .'! 这是重定向后的 dome 页面<br><a href="/index/index/back">点击回到来源地址</a>';
}
//访问链接
public function name()
{
// 判断session完成标记是否存在
// 主要是用于回源完成后执行
if (session('?back')) {
// 删除session
session('back', null);
return '重定向完成,回到原点!';
} else {
//利用 remember 方法记住当前地址。
return redirect('dome')->with("name","Snail")->remember();
}
}
//设置标记中转方法
public function back(){
//设置判断变量 back
session('back',true);
//回到原址
return redirect()->restore();
}
具体结果图 ↓
图一:
图二:
图三:
注意:图三所描述的场景,刷新重定向「目标页」,会丢的不仅仅数据,还有回家的路。