菜单 学习猿地 - LMONKEY

VIP

开通学习猿地VIP

尊享10项VIP特权 持续新增

知识通关挑战

打卡带练!告别无效练习

接私单赚外块

VIP优先接,累计金额超百万

学习猿地私房课免费学

大厂实战课仅对VIP开放

你的一对一导师

每月可免费咨询大牛30次

领取更多软件工程师实用特权

入驻
54
0

Laravel 消息包和验证器的关系

原创
05/13 14:22
阅读数 496

1. 介绍

1.1 思考一个问题

应用程序经常在各个组件之间传递信息 ,并最终将信息呈现给用户

比如控制器可能需要发送 "email 字段是必须的" ,但是该消息可能不仅要发送给视图层 ,还要在重定向中生存 ,最终出现在不同页面的视图层

如何构建这种消息传递的逻辑呢 ?

1.2 Illuminate\Support\MessageBag

Laravel 中的 Illuminate\Support\MessageBag 是一个负责存储 、分类和返回最终用户消息的类

它通过 key 分组所有的消息 ,key 类似于 errors 、messages 等 ,同时该类提供了获取和输出这些消息的方法

2. 演示使用 Illuminate\Support\MessageBag

// 手动创建一个消息包
$message = [
    'errors' => ['error'],
    'messages' => ['message']
];

$messagebag = new Illuminate\Support\MessageBag($messages);

// 使用上面的消息包 :检查错误 ,如果有错误就输出错误信息
if ($messagebag->has('errors')) {
    foreach ($messagebag->get('errors') as $error) {
        echo "<li>${error}</li>";
    }
}

上面的例子几乎没什么意义 ,但是 "消息包" 与 Laravel 的验证器是密切相关的

3. 消息包和验证器

在验证器验证不通过时 ,实际上返回的是一个 MessageBag 实例 ,然后可以将这个消息包传递给视图或添加到重定向 ,下面是一个重定向的例子

// 这样就可以在重定向的视图中通过 $errors 变量访问验证信息了
redirect('route')->withErrors($messagebag);

Laravel 会将 MessageBag 的一个空实例传递给每个视图 ,分配给变量 $errors

如果在重定向上使用 withErrors() 闪存了一个消息包 ,也会将其分配给变量 $errors

这意味着每个视图总是可以假设有一个名为 $errors 的 Illuminate\Support\MessageBag 实例使用

<!-- errors.blade.php -->
<!-- 这里是在视图中使用 $errors 的一个小演示 -->
@if ($errors->any())
    @foreach ($errors as $error)
        <li>{{ $error }}</li>
    @endforeach
@endif

4. 错误包命名

有时候 ,可能需要区分消息包 ,而且不仅仅是通过键 notices 或 errors 区分 ,还需要根据组件来区分

比如同一页有登录表单和注册表单 ,这时候就可以用 withErrors() 的第二个参数来给包命名

redirect('route')->withErrors($validator, 'login');

在视图中使用

<!-- 这个 login 也是 Illuminate\Support\MessageBag 实例 ,可以调用相关的所有方法 -->
<!-- 比如前面看到的 any() 等 -->
$errors->login

有错误的地方欢迎指出 ,或者补充也可以 ,感谢每个对我提出建议的人

本作品采用《CC 协议》,转载必须注明作者和本文链接

发表评论

0/200
54 点赞
0 评论
收藏
为你推荐 换一批