美文网首页
laravel 的消息包

laravel 的消息包

作者: 苍松拔雨 | 来源:发表于2020-01-09 07:15 被阅读0次

    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
    

    相关文章

      网友评论

          本文标题:laravel 的消息包

          本文链接:https://www.haomeiwen.com/subject/zdgeactx.html