在从控制器重定向后,在Laravel中显示错误消息

102

如何在 Laravel 中显示重定向视图中的验证消息?

这是控制器中的一个函数:

public function registeruser()
{
    $firstname = Input::get('firstname');
    $lastname = Input::get('lastname');
    $data  =  Input::except(array('_token')) ;
    $rule  =  array(
                'firstname'       => 'required',
                'lastname'         => 'required',
                   ) ;
    $validator = Validator::make($data,$rule);
    if ($validator->fails())
    {
    $messages = $validator->messages();
    return Redirect::to('/')->with('message', 'Register Failed');
    }
    else
    {
    DB::insert('insert into user (firstname, lastname) values (?, ?)',
                                array($firstname, $lastname));
    return Redirect::to('/')->with('message', 'Register Success');
    }
    }

我知道以下给出的代码很糟糕,但我该如何修复它,我遗漏了什么?

@if($errors->has())
    @foreach ($errors->all() as $error)
        <div>{{ $error }}</div>
    @endforeach
@endif

更新:如何在特定字段附近显示错误消息


4
你需要返回错误信息,类似于return Redirect::to('/')->withErrors($validator); - Vucko
谢谢,它帮助了我。 - SA__
@SA__ 在验证重定向之后,你是如何保存每个字段中输入的值的? - user5621153
15个回答

212

Laravel 4

当验证失败时,返回带有验证错误的原页面。

if($validator->fails()) {
    return Redirect::back()->withErrors($validator);
}

您可以使用以下方法在视图上捕获错误:

@if($errors->any())
    {{ implode('', $errors->all('<div>:message</div>')) }}
@endif

更新

要在每个字段下显示错误,您可以按照以下方式操作。

<input type="text" name="firstname">
@if($errors->has('firstname'))
    <div class="error">{{ $errors->first('firstname') }}</div>
@endif

为了更好地使用CSS进行展示样式。

您可以参考此处的文档。

更新2

要一次显示所有错误信息。

@if($errors->any())
    {!! implode('', $errors->all('<div>:message</div>')) !!}
@endif

显示每个字段下的错误。

@error('firstname')
    <div class="error">{{ $message }}</div>
@enderror

<input type="text" name="firstname">如何在验证后保留输入的值? - user5621153
1
<input type="text" name="firstname" value="{{ old('firstname') }}"> 或者使用表单助手,它会在验证错误后自动保留值。 - Sushant Aryal
1
请注意$errors->first('firstname')只会显示给定字段的第一个错误信息。您可能会有多个错误;将它们作为数组获取以进行循环,如下所示:$errors->get('firstname') - Jason
1
对于使用Bootstrap的人,这是您的代码片段:@if($errors->any()) {!! implode('', $errors->all('<div class="alert alert-danger" role="alert">:message</div>')) !!} @endif - phoenix

37

如果您想从您所在的控制器中加载视图:

if ($validator->fails()) {
    return self::index($request)->withErrors($validator->errors());
}

如果您想快速显示所有错误,但希望有更多的控制:

 @if ($errors->any())
     @foreach ($errors->all() as $error)
         <div>{{$error}}</div>
     @endforeach
 @endif

11
@if ($errors->has('category'))
    <span class="error">{{ $errors->first('category') }}</span>
@endif

2
请提供一些细节。 - Syeda Zunaira
3
请在您的答案中提供更多细节,以概括您的代码功能。 - Popeye

8

新的Laravel Blade错误指令出现在Laravel 5.8.13

// Before
@if ($errors->has('email'))
    <span>{{ $errors->first('email') }}</span>
@endif

// After:
@error('email')
    <span>{{ $message }}</span>
@enderror

7

为使其外观更为美观,您可以使用一些Bootstrap辅助功能。

@if(count($errors) > 0 )
<div class="alert alert-danger alert-dismissible fade show" role="alert">
    <button type="button" class="close" data-dismiss="alert" aria-label="Close">
        <span aria-hidden="true">&times;</span>
    </button>
    <ul class="p-0 m-0" style="list-style: none;">
        @foreach($errors->all() as $error)
        <li>{{$error}}</li>
        @endforeach
    </ul>
</div>
@endif

5
你可以像下面这样使用,带有HTML标签的打印输出:
@if($errors->any())
    {!! implode('', $errors->all('<div>:message</div>')) !!}
@endif

5
$validator = Validator::make($request->all(), [ 'email' => 'required|email', 'password' => 'required', ]);

if ($validator->fails()) { return $validator->errors(); }

很棒,你正在帮助解决问题,能否请您为经验不足的同伴们解释一下您的代码是如何解决问题的呢?为了使帖子更简洁易读,请使用stackoverflow建议的适当格式。https://stackoverflow.com/editing-help - leopold

4
@if ($errors->any())
    <div class="alert alert-danger">
        <ul>
            @foreach ($errors->all() as $error)
                <li>{{ $error }}</li>
            @endforeach
        </ul>
    </div>
@endif

请解释一下你的答案。例如,为什么这个能够工作? - Rohit Gupta

1

在输入字段下面,我包括了额外的视图:

@include('input-errors', ['inputName' => 'inputName']) #For your case it would be 'email'

input-errors.blade.php

@foreach ($errors->get($inputName) as $message)
    <span class="input-error">{{ $message }}</span>
@endforeach

CSS - 添加红色到消息。

.input-error {
    color: #ff5555;
}

1

1
欢迎来到Stackoverflow,很高兴在这里看到一个好的第一篇答案,我已经为您点赞了。但请考虑添加一个指向此特定方法的API文档链接,并注明您正在使用哪个版本的Laravel。 - Mike

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