【问题标题】:Add a message to the $error MessageBag将消息添加到 $error MessageBag
【发布时间】:2021-07-16 20:37:35
【问题描述】:

这是 Laravel 4.2

Laravel 将使 $error MessageBag 可用于视图。这可以通过重定向->withErrors()上一页 页面中填充闪存消息。如果您要重定向到新页面,那很好。

return Redirect::route('my_route')->withErrors($validator);

我在控制器中生成了一些错误,而不是验证表单,并希望将这些消息放入 Laravel 自动传递到视图的 $errors MessageBag 中。但是怎么做? MessageBag 在somewhere,但我如何才能找到它,以及如何向它添加一些消息以显示在当前 页面中?

【问题讨论】:

    标签: php laravel


    【解决方案1】:

    看起来我可以在创建视图时注入消息。

    我的控制器将所需的视图及其收集的数据传递给页面模板的内容,如下所示:

    $this->layout->content = View::make('my.view', $view_data);
    

    错误可以这样传入:

    $this->layout->content = View::make('my.view', $view_data)->withErrors($my_errors);
    

    其中 $my_errors 可以是 null 或 array()(表示“没有其他错误”)、文本消息数组或 MessageBag。

    然后,我的外部页面模板只会拾取消息(如果存在),并将它们显示在页面顶部:

    @if ( $errors->count() > 0 )
        ...An error occured...
        @foreach( $errors->all() as $message )
            ...{{ $message }}...
        @endforeach
    @endif
    

    (在适当的地方使用标记)

    【讨论】:

    • 传递文本消息数组的能力可能只是我显示消息的方式的人工制品。我认为坚持使用 MessageBag 会更加一致。
    • 我确实不喜欢接受自己的答案,但这解决了我的问题,一旦我发现 View 类有一个 withErrors() 方法允许将消息注入 $errors(它们与Laravel 已经从任何前一页重定向中提取的任何内容)。
    【解决方案2】:

    我已经通过一些自定义验证做到了这一点。你需要的是这样的:

    use Illuminate\Support\MessageBag;
    
    class MyCustomValidator
    {
        protected $errors = array();
    
        protected $messageBag;
    
        public function __construct(MessageBag $messageBag)
        {
            $this->messageBag = $messageBag;
        }
    
        public function setErrors($errors = array())
        {
            for($i = 0; $i < count($errors); $i++) {
                $this->messageBag->add($i, $errors[$i]);
            }
    
            $this->errors = $this->messageBag;
        }
    
        public function getErrors()
        {
            return $this->errors->all();
        }
    }
    

    在你的控制器中,你必须调用类似的东西

    $validator = new MyCustomValidator();
    $validator->getErrors();
    

    您可以访问 MessageBag in the docs 的完整文档。

    【讨论】:

    • 那么 Laravel 会自动将全局 MessageBag 注入验证器吗?所以这只是获取 MessageBag 的一个技巧?
    • 当你做这样的事情-&gt;withErrors($validator)你告诉laravel你的视图将收到一个变量$errors,其内容为$validator。通常,$validator$validation-&gt;messages(),它返回类 \Illuminate\Support\MessageBag 的对象(在此上下文中,变量 $validation 是类 Illuminate\Validation\Factory 的实例,与外观 Validator 相同)。实际上,您将 MessageBag 传递给视图,它不会自动注入。
    • 谢谢。创建我不知道的视图时是-&gt;withErrors()。我的消息不是来自任何类型的验证器,所以大概我可以创建一个 MessageBay,添加消息并将其传递进去。
    • 谢谢。这很有用,并为将来添加了书签。然而,这可能与我特别试图解决的问题无关,因为我没有处理任何类型的 Laravel 验证器,无论是否定制。该错误是通过调用外部支付网关返回的,所以我只需要一种简单的方法将该消息推送到 [当前] 页面。
    • 在我看来,验证必须执行数据验证(无论是在数据库中还是在逻辑中)。在您的情况下,您似乎有一个逻辑验证。这实际上取决于您如何构建代码,但我会在验证类中创建该验证,而不是直接在控制器中创建它。
    【解决方案3】:

    Laravel 5

    $validator = .......
    
    $validator->after(function($validator) {
        .....               
        $validator->errors()->add('tagName', 'Error message');
        .....
    });
    

    请注意,匿名函数在类的范围内,而不是在类的范围内 您使用它的功能。如果你需要外部世界的某个变量的值,它必须是一个类变量!

    【讨论】:

      【解决方案4】:

      迟到但在错误消息包中添加自定义消息的另一种解决方案是:

      控制器

      $rules = array(
              'email' => 'required|exists:users,email|email|max:32',
              'password' => 'required|max:20'
          );
          $validator = Validator::make($request->all(),$rules);
      
      
          $email = $request->email;
          $password = $request->password;
      
          $validateUser = new user();
          $users = $validateUser::where('email', $email)->get();
          if($users->isEmpty()){
              $validator->getMessageBag()->add('email', 'Invalid Email Address');    
              return redirect('home')->withErrors($validator);
          }
          foreach ($users as $user) {
              $data = $user->showAdminData();
              if($user->role_id!=1){
                  $validator->getMessageBag()->add('email', 'Unauthorised access');
              }
              if(Crypt::decrypt($user->password)!==$password){
                  $validator->getMessageBag()->add('password', 'Invalid Password');
              }
          }
          return redirect('home')->withErrors($validator);
      

      查看

      <div class="form-group{{ $errors->has('email') ? ' has-error' : '' }}">
                              <label class="col-md-4 control-label">E-Mail Address</label>
      
                              <div class="col-md-6">
                                  <input type="email" class="form-control" name="email" value="{{ old('email') }}">
      
                                  @if ($errors->has('email'))
                                  <span class="help-block">
                                      <strong>{{ $errors->first('email') }}</strong>
                                  </span>
                                  @endif
                              </div>
                          </div>
      
                          <div class="form-group{{ $errors->has('password') ? ' has-error' : '' }}">
                              <label class="col-md-4 control-label">Password</label>
      
                              <div class="col-md-6">
                                  <input type="password" class="form-control" name="password">
      
                                  @if ($errors->has('password'))
                                  <span class="help-block">
                                      <strong>{{ $errors->first('password') }}</strong>
                                  </span>
                                  @endif
                              </div>
                          </div>
      

      【讨论】:

      • 我在 so 很多地方和示例中看到$errors-&gt;first(...),好像任何错误列表中的第一个错误(在上下文中)是唯一重要的错误。为什么它在 Laravel 中坚持了这么多年?只是觉得我很懒。无论如何,感谢您的输入,但我不确定它是否解决了最初的问题——这只是一个示例,说明错误如何在正常表单验证中跨页面闪烁。还是我错过了什么?
      猜你喜欢
      • 2014-02-23
      • 2011-04-15
      • 2022-01-19
      • 2020-11-27
      • 1970-01-01
      • 2013-11-23
      • 1970-01-01
      • 2019-08-24
      • 1970-01-01
      相关资源
      最近更新 更多