Laravel 5.2验证错误未出现

时间:2016-01-19 22:33:05

标签: php validation laravel laravel-5 laravel-5.2

我试图让验证错误显示在Laravel中。

我有一个像这样设置的UserController:

<?php

namespace App\Http\Controllers;

use App\User;
use App\Http\Controllers\Controller;
//Use Request;
Use Flash;
Use Illuminate\Http\Request;

class UserController extends Controller
{
    /**
     * Show the profile for the given user.
     *
     * @param  int  $id
     * @return Response
     */
    public function showProfile($id)
    {
        return view('user.profile', ['user' => User::findOrFail($id)]);
    }

    public function store(Request $request) {
        $this->validate($request, [
            'email' => 'required|unique:users|email|max:255',
        ]);

        if($this) {

        $input = Request::all();

        User::create($input);

        return redirect('/');

        }
        else {

            return redirect('/')->withErrors($validator);
        }
    }
}

在我看来(layout.blade.php),我已经包括:

@if (count($errors) > 0)
@foreach ($errors->all() as $error)
   {{!! $errors !!}}
@endforeach
@endif

考虑到路线,我有:

Route::group(['middleware' => ['web']], function () {
    Route::get('/', function (){
        return view('home');
    });
});

不幸的是,当我进入&#34;坏&#34;不应该验证的数据,我没有看到任何错误(但它没有存储在数据库中,所以就是这样)。

另一个注意事项,当渲染刀片模板时,我看到了额外的&#34;}&#34;支架,我不确定为什么会这样。

4 个答案:

答案 0 :(得分:15)

在laravel版本5.2.41中,中间件网络被抛弃。

意味着在$for item in item_list: <td>$item.get("fans_cnt")/1000</td> 内添加路线会使验证失效。

答案 1 :(得分:6)

有些事情有问题,或者可以在这里改进。 UserController上的store方法有很多奇怪的问题。 $this将永远为真,因为对象在php中是真的。此外,您将$validator传入withErrors这是没有意义的,因为没有变量validator

public function store(Request $request) {
    $this->validate($request, [
        'email' => 'required|unique:users|email|max:255',
    ]);

    User::create(Request::all());
    return redirect('/');
}

如果存在验证错误,validate方法将抛出Illuminate\Foundation\Validation\ValidationException。此异常应列在$dontReport中的App\Exceptions\Handler实例变量中,如下所示:

protected $dontReport = [
    AuthorizationException::class,
    HttpException::class,
    ModelNotFoundException::class,
    ValidationException::class,
];

如果您更改了这些值,删除或修改了ValidatesRequest特征,则可能会破坏此功能。

您的错误报告代码也不正确:

@foreach ($errors->all() as $error)
   {!! $errors->first() !!}
@endforeach

这里有3个变化。首先,我删除了外部错误大小检查,这并没有真正得到任何东西。接下来,我修复了额外的}错误,取消转义数据的语法为{!! $errors->first() !!}。最后,我调用->first()这会返回与该特定字段相关的第一个错误。

我认为重要的是要注意验证异常将创建对上一页的重定向响应。可以在Illuminate\Routing\UrlGenerator::previous()中找到确定上一页的逻辑。

答案 2 :(得分:0)

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

答案 3 :(得分:-1)

错误块应为:

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

假设您使用Bootstrap作为警报。

您还没有定义$validator。你需要做这样的事情:

$validator = Validator::make($request->all(), [
    'email' => 'required|unique:users|email|max:255',
]);

而不是$this->validate()

应该这样做。