Laravel思维导图之Laravel HTTP 请求、响应、表单验证

Laravel HTTP 层

今天我来分享 Laravel 中 HTTP 层关于请求、响应与表单验证的知识。

0x00 HTTP 请求

HTTP请求

获取请求

在控制器方法中使用 Illuminate\Http\Request 类型提示,
可以以依赖注入方式来获取当前 HTTP 请求的实例。

将路由参数置于其他依赖之后可以传入路由参数。

Request 提供了内置方法来便捷地做请求相关处理。

  • path 方法返回请求路径信息。
  • is 方法验证收到的请求路径与指定规则是否匹配。
  • url 返回不带有查询字符串的 URL。
  • fullUrl 返回包含查询字符串的完整 URL。
  • method 方法返回 HTTP 请求方式。
  • isMethod 方法验证 HTTP 请求方式与指定规则是否匹配。

输入数据的预处理与规范化

在 Laravel 的全局中间件中默认包含了 TrimStringsConvertEmptyStringsToNull 两个中间件。这些中间件被列在 App\Http\Kernel 类中。它们会自动处理所有请求中传入的字符串字段,比如将空的字符串字段转变成 null 值。想停用这些功能,则需要在 App\Http\Kernel 类的 $middleware 属性中移除这些中间件。

获取输入数据

Laravel 支持从 Request 中获取常规数据、旧输入数据、cookies。

获取常规数据的方法有:

  • 使用 all 方法以 数组 形式获取到所有输入数据。
  • input 方法获取指定输入值。
  • 通过动态属性获取输入数据。
  • 通过 json 方法获取 JSON 输入信息。
  • 通过 only/except 方法获取部分输入数据。
  • 通过 has 方法确定是否有输入值。

对于旧数据,Laravel 允许你将本次的输入数据保留到下一次请求发送前。
这个特性在表单验证错误后重新填写表单相当有用。

获取输入数据

文件资源

获取上传文件的相关方法:

  • file 方法获取上传的文件。
  • hasFile 方法确认上传的文件是否存在。
  • isValid 方法验证上传的文件是否有效。

UploadedFile 这个类也包含了访问文件完整路径和扩展的方法。

  • path 方法获取路径。
  • extension 方法获取扩展名。

此外,store 方法支持上传文件储存到本地磁盘或者云存储上。

0x01 HTTP 响应

HTTP响应

所有路由和控制器都会返回一个响应并返回给用户的浏览器。

创建响应

Laravel 支持的 HTTP 响应类型包括字符串、数组、对象、附件头信息、附加 Cookie 等。

创建响应

重定向

重定向响应是 Illuminate\Http\RedirectResponse 类的实例,
并且包含用户需要重定向至另一个 URL 所需的头信息。

Laravel 支持:

  • 通过全局 redirect 辅助函数实现重定向。
  • 通过 back 辅助函数实现重定向至上级页面。
  • 重定向至命名路由,并根据需要携带普通或 Eloquent 模型参数。
  • 通过 action 方法传递控制器和行为名称作为参数来实现重定向至控制器行为。
  • 重定向至一个新的 URL 的同时通常会 附加 Session 闪存数据。
重定向

其他响应

使用全局辅助函数 response 可以轻松的生成其他类型的响应实例。

其他响应

响应宏

自定义可以在很多路由和控制器重复使用的响应,可以使用 Response Facade 实现的 macro 方法。

0x02 表单验证机制详解

Laravel 提供了多种不同的验证方法来对应用程序传入的数据进行验证。默认情况下,Laravel 的基类控制器使用 ValidatesRequests Trait,它提供了方便的方法使用各种强大的验证规则来验证传入的 HTTP 请求数据。

表单验证

快速上手实例

表单验证实例

重点在于在控制器的方法中,添加验证逻辑。

表单请求验证

这部分与上面实例的差别在于为了满足更复杂的验证情境,我们需要创建一个表单请求。表单请求是一个自定义的请求类,里面包含着验证逻辑。想要运行验证规则,在控制器方法中利用类型提示传入请求。

表单请求验证

在自定义的表单请求类中可以实现:

  • 通过 rules 方法添加验证规则。
  • 通过 withValidator 方法在表单请求以后添加钩子。
  • 通过 authorize 方法授权表单请求。
  • 重写 App\Http\Requests\Request 中的
    formatErrors 方法来自定义错误格式。
  • 重写 messages 方法自定义错误消息。

手动创建验证请求

之前的内容是直接使用 ValidatesRequests Trait 的 validate 方法来实现表单验证。此外,还可以手动创建一个 validator 实例并通过 Validator::make 方法在 Facade 生成一个新的 validator 实例来实现表单验证。

手动创建验证请求

处理错误消息

调用 Validator 实例的 errors 方法,会得到一个 Illuminate\Support\MessageBag 的实例,可以对 MessageBag 进行各种处理,以满足具体的需求。

处理错误消息

常用的错误信息相关方法:

  • 通过 first 方法查看特定字段的第一个错误消息。
  • 通过 get 方法查看特定字段的所有错误消息。
  • 通过 all 方法查看所有字段的所有错误消息。
  • 通过 has 方法判断特定字段是否含有错误消息。

自定义错误消息则主要通过传递三个参数到 Validator::make 方法来实现。

内置可用的验证规则

Laravel 内置了大量可用的验证规则。如下图:

可用的验证规则

具体用法可以查看文档:http://d.laravel-china.org/docs/5.4/validation#available-validation-rules

按条件添加规则

Laravel 还可以实现灵活的根据条件添加规则,如当字段存在时才进行验证,以及更多复杂的自定义验证规则。

按条件添加规则

验证数组

对于请求中的数组参数,可以使用型号 * 字符获取所有数组中的项。

验证数组

自定义规则

除了 Laravel 内置的验证规则外,还可以根据需要自定义规则。在 服务提供者 中使用 Validator Facade 中的 extend 方法来注册自定义的验证规则。

自定义规则

0x03 下一步

到这篇为止,我完成了 Laravel 入门指南核心概念、HTTP 层的路由、中间件、控制器、请求、响应、表单验证的学习和整理。这几个部分已经可以让你实现简单的面向前端的接口。

接下来我将对数据库及 ORM 部分进行学习和整理。绝大多数应用的数据都存储在数据库中,服务端的功能围绕着数据库中存储的数据展开,从而构建了强大的应用。

0x04 写在最后

对于知识的学习,整理是非常关键的一环,有助于加深理解。

对于 Laravel 的学习我将持续地以思维导图的方式整理输出,并首发在微信公众号 up2048 上分享给需要的读者。

由于思维导图在导出成图片的过程中会变得模糊,为了方便读者,我也提供了思维导图源文件的下载。读者可根据需要,关注微信公众号:up2048,并回复“脑图”来免费获取

- EOF -

推荐阅读

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容

  • 1、简介 Laravel 提供了多种方法来验证应用输入数据。默认情况下,Laravel 的控制器基类使用Valid...
    伊Summer阅读 1,520评论 0 3
  • 验证 简介 Laravel 对验证应用的输入数据提供了多中途径的实现。默认的,Laravel 的基础控制器类使用了...
    Dearmadman阅读 10,191评论 5 8
  • HTML表单 在HTML中,表单是 ... 之间元素的集合,它们允许访问者输入文本、选择选项、操作对象等等,然后将...
    兰山小亭阅读 3,408评论 2 14
  • 原文链接 必备品 文档:Documentation API:API Reference 视频:Laracasts ...
    layjoy阅读 8,602评论 0 121
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,585评论 18 139