Laravel消息包错误

8
我正在为一个项目的新闻通讯表单验证工作,该新闻通讯表单出现在每个页面上,因此它也会出现在登录和注册页面上,因此我决定使用 Laravel Message Bags 存储新闻通讯错误,但是它在实际页面上检查并输出错误时一直给我一个未定义的属性错误,我不知道我是否做错了什么,这里是详细信息!

错误:

Undefined property: Illuminate\Support\MessageBag::$newsletter

我的代码在控制器中:

return Redirect::back()->withInput()->withErrors($inputs, "newsletter");

我的视图中的代码:

 @if($errors->newsletter->any())

 <p>
    {{$errors->newsletter->any()}}
 </p>
4个回答

10

控制器中的代码:

         $post_data = Input::all();

    $validator = Validator::make(Input::all(),
        array(
            'email' => 'required',
            'password' => 'required'
        ));


    if ($validator->fails()) {

        return Redirect::back()
            ->withInput()
            ->withErrors(['auth-validation' => 'ERROR: in validation!']);
    } 

视图中的代码:

@if($errors->any())
    @foreach($errors->getMessages() as $this_error)
        <p style="color: red;">{{$this_error[0]}}</p>
    @endforeach
@endif 

你可以简单地使用 $errors->all('<p style="color: red;">:message</p>')。视图将验证并仅在出现错误时编写。 - Alwin Kesler

8

RedirectResponse类函数withErrors()没有第二个参数。

函数vendor\laravel\framework\src\Illuminate\Http\RedirectResponse.php -> withErrors()

/**
 * Flash a container of errors to the session.
 *
 * @param  \Illuminate\Support\Contracts\MessageProviderInterface|array  $provider
 * @return \Illuminate\Http\RedirectResponse
 */
public function withErrors($provider)
{
    if ($provider instanceof MessageProviderInterface)
    {
        $this->with('errors', $provider->getMessageBag());
    }
    else
    {
        $this->with('errors', new MessageBag((array) $provider));
    }

    return $this;
}

所以,如果你真的想使用MessageBag,那么这应该可以工作(没有测试):
$your_message_bag = new Illuminate\Support\MessageBag;
$your_message_bag->add('foo', 'bar');

return Redirect::back()->withInput()->withErrors($your_message_bag->all());

我应该用什么来代替“foo”和“bar”? - Daniel Barde
这只是一个示例,说明如何向MessageBag添加项目以使示例更完整。从您的问题中我了解到您已经在MessageBag中存储消息“我决定使用Laravel Message Bags来存储新闻通讯错误”,所以如果您已经有了消息,则只需在withErrors()函数中将变量$your_message_bag替换为您的消息包变量即可。 - Sven van Zoelen
根据Laravel文档[链接]http://laravel.com/docs/4.2/validation,返回重定向:return Redirect::to('register')->withErrors($validator, 'login'); - martyn
在Laravel 5中(未在L4中测试),您可以使用return back()->withInput()->withErrors([$custom1, $customN]);。我从您的回复中推断出这可能会对某些人有所帮助。 - Alwin Kesler
什么是foo bar?是什么的示例?错误消息还是错误键? - Toskan

1

withErrors应该接收验证器对象的信息。在您的验证过程完成后,类似于以下内容:

  $validation = Validator::make(Input::all(), $validation_rules);
  if (!$validation->passes()){
       return Redirect::back()->withInput()->withErrors($validation->messages());
  }

我希望它对您来说正常工作。


嗨@fmgonzalez,我正在尝试创建一个消息包,但在查找错误时,视图一直报错,说“未定义属性:Illuminate\Support\MessageBag::$newsletter”。 - Daniel Barde

-1
你可以编写这样的函数。
if(!function_exists('errors_for')) {

 function errors_for($attribute = null, $errors = null) {

    if($errors && $errors->any()) {

        return '<p class="text-danger">'.$errors->first($attribute).'</p>';

    }   

 }

}

然后在你的视图中

<div class="form-group">
   <label for="bio">Bio</label>
   <textarea class="form-control" name="bio"></textarea>
</div>
{!! errors_for('bio',$errors) !!}

在Laracasts上从Jeffrey Way学到的


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接