控制器验证
响应

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();
    }

具体结果图 ↓
图一:
图二:
图三:

注意:图三所描述的场景,刷新重定向「目标页」,会丢的不仅仅数据,还有回家的路。