3分钟短文:Laravel把数据验证的手伸向“请求体”

简介: 代码分离,设计中间层果然是大杀器

引言

上一章讲述了表单数据验证,从前端页面接收用户的输入信息,通过POST方法提交数据到相应路由地址,
并使用Request请求体的validate方法,默认传入request()->input()的参数,并调用传入的验证规则,
从而实现数据的初步筛选。

img

把数据验证,验证规则,和控制器的逻辑处理代码混合在一起,是不是有点怪怪的?我们说,一个中间层只做一件事情,这样才能松耦合,提高鲁棒性。

所以有了这篇文章,教你把数据验证提炼出来。

代码时间

laravel在请求相关的业务逻辑上设计的很灵活,你完全可以把验证流程从控制器方法中剥离出去,
这样你只需在相关的层面,专注于相关的逻辑就可以了。

首先使用命令行创建一个请求体对象:

php artisan make:request EventStoreRequest

输出内容如下:

Request created successfully

上述方法会生成一个文件位于 app/Http/Requests/EventStoreRequest.php,我们把系统默认的代码贴出来:

namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class EventStoreRequest extends FormRequest 
{
    public function authorize()
    {
        return false;
    }  
    
    public function rules()
    {
        return [];
    }
}

其中 authorize方法用于实现逻辑判断,那些用户,或者满足那些条件可以使用该请求体。返回 false表示所有调用均不被允许验证,也就是不会调用任何 rules方法声明的规则。

此处我们还没有关于权限判断的需求,所以,让所有调用此请求类的方法,都默认调用验证规则,只需修改上述方法如下:

public function authorize()
{
    return true;
}

其中 rules方法执行了需要执行的验证器的规则,laravel默认内置了很多常用规则,基本够用。使用方法见上一节我们的文章。

现在,把上一节中所使用的验证规则拿来,修改 rules 方法如下:

public function rules()
{
    return [
        'name' => 'required|min:10|max:50',
        'max_attendees' => 'required|integer|digits_between:2,5',
        'description' => 'required'
    ];
}

规则所表示的意义我们在上一节已经详细介绍了。我们把目光放在如何使用该请求体。

回到控制器 EventControllerstore 方法内,这个是restfulapi 中用于接收POST请求体数据,并写入数据库的操作。此处我们需要指定请求体类型,使其默认使用 EventStoreRequest,这样就可以发挥验证规则的作用了。

使用依赖注入方式,直接在 store 方法内实例化一个请求体:

use App\Http\Requests\EventStoreRequest;
public function store(EventStoreRequest $request)
{
    $event = Event::create($request->input());
    return redirect()->route('events.show', ['event' => $event]);
}

使用此方法,使我们的代码精简了很多。最重要的数据验证,交给了 EventStoreRequest 类来完成,这就完成了代码层的分离。

默认内置的验证规则所返回的错误信息提示,不满足使用的话,还可以自定义,在 EventStoreRequest 内实现 messages 方法就可以了:

public function messages()
{
    return [
        'required' => '必填字段 :attribute',
        'name.min' => '最少10个字符',
        'name.max' => '最多50个字符',
        'max_attendees.digits_between' => '2-5位数字'
    ];
}

这完全是上一章的手动自定的返回信息,写在此处作为数组返回就搞定了。

写在最后

本文深入laravel数据验证的方法,从特殊走向一般,并尝试把验证相关的代码从控制器内分离出来。使用自定义的请求体类,成功实现了代码的分离,而可控制性也更强了。而验证规则,和自定义的错误信息,则没有一丝丝改变!

Happy coding :-)

我是@程序员小助手,专注编程知识,圈子动态的IT领域原创作者

相关文章
|
1月前
|
JSON 前端开发 Java
震惊!图文并茂——Java后端如何响应不同格式的数据给前端(带源码)
文章介绍了Java后端如何使用Spring Boot框架响应不同格式的数据给前端,包括返回静态页面、数据、HTML代码片段、JSON对象、设置状态码和响应的Header。
121 1
震惊!图文并茂——Java后端如何响应不同格式的数据给前端(带源码)
|
1月前
|
人工智能 自然语言处理 机器人
我们用GLM-4-Plus搞了个“阅读智能体”,工作效率提升了300%
近期,大模型领域不断传来新消息。9月中旬,OpenAI悄然发布o1模型预览版,随后智谱推出了包括最新旗舰模型GLM-4-Plus在内的多个更新。GLM-4-Plus在语言理解、长文本处理及时序问答方面表现出色,清华大学基础模型研究中心测评显示其综合能力全球前三。通过API接口,GLM-4-Plus可解决实际工作中的多种问题,如财务报告分析、信息提取及视频脚本生成等,显著提升效率。此外,智谱还计划与硬件开发者合作,拓展更多应用场景。
|
1月前
|
iOS开发 MacOS Python
ChatGPT编程实现简易聊天工具
ChatGPT编程实现简易聊天工具
|
5月前
|
数据采集
技术心得:我在写爬虫的验证码识别方案之有个平台叫无限代码
技术心得:我在写爬虫的验证码识别方案之有个平台叫无限代码
50 0
|
6月前
|
人工智能 缓存 自然语言处理
ChatGPT消息发不出去?ChatGPT没反应?那是这个步骤少做了!
今天在工作的过程中,我正准备登陆ChatGPT咨询一些关于文案的问题,但突然发现自己无法发送消息了。 “ChatGPT消息发送故障,但历史对话仍可查看。为了解决问题,您可以先访问OpenAI官方网站:https://status.openai.com/。 这个网站提供了Open AI系统的实时状态监控,非常方便实用。”
166 0
ChatGPT消息发不出去?ChatGPT没反应?那是这个步骤少做了!
|
人工智能 移动开发 测试技术
你的交互文档写的好不好?一看便知!
你的交互文档写的好不好?一看便知!
120 0
|
人工智能 JSON 测试技术
语言模型悄悄偷懒?新研究:​上下文太长,模型会略过中间不看
语言模型悄悄偷懒?新研究:​上下文太长,模型会略过中间不看
125 0
|
Web App开发
25个出众的Web表单范例
表单可能成为网站至关重要的组成部分。从非常简单直接的表单到花哨、多彩和创意的表单,每个网站都会呈现一种表单风格。当考虑站点的界面设计时,这必定是你应该关注的元素。不论是登录/注册表单,还是联系表单,或者其他类型表单,我们需要牢记一点:这些表单的目标是要赢得用户的注意,让他们想要在其 中填入信息。
872 0
热饭的测开成果盘点第二十三期:wqrfproxy自动抓包断言库
本期介绍的是一个组件,身为python的第三方库,已经被pypi收录,且国内镜像源也早已复制。也就是说可以通过pip install 来下载。这个组件就是:wqrfproxy ,它的作用是可以在正常的unittest脚本中,对app发出的请求进行断言。
热饭的测开成果盘点第二十三期:wqrfproxy自动抓包断言库
|
测试技术 Python
【测试必会】一文学透Mock!
【测试必会】一文学透Mock!
160 0