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
网友评论