Ошибки проверки 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');
    });
});

К сожалению, когда я ввожу «плохие» данные, которые не следует проверять, я не вижу никакой ошибки (но она не сохраняется в БД, так что вот это).

Еще одно замечание: когда шаблон блейда отображается, я вижу дополнительную скобку «}», и я не уверен, почему она там.


person user1072337    schedule 19.01.2016    source источник


Ответы (3)


Здесь есть пара вещей, которые можно исправить. Метод store в UserController имеет много странных проблем. $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().

person Logan Bailey    schedule 20.01.2016

В laravel версии 5.2.41 сеть промежуточного программного обеспечения выброшена.

Означает, что добавление маршрутов внутри Route::group(['middleware' => ['web']], function () { приведет к тому, что проверка не будет работать.

person Mirza Vu    schedule 28.07.2016
comment
МОЙ БОГ! Я потратил почти час, пытаясь понять это, пока не написал твое сообщение. Это совершенно верно! Я следую учебнику, которому несколько месяцев, и они все еще используют «сеть промежуточного программного обеспечения», что мне показалось забавным, потому что, когда я создавал свой проект Laravel, такой вещи не было в файле route.php. Я просто удалил его и вернул обратно, как было, и теперь я могу читать свои ошибки. Спасибо! - person Manu Gtez; 06.10.2016
comment
То же самое произошло со мной. 2 часа разбирался :) - person Mirza Vu; 07.10.2016

Блок ошибок должен быть:

@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().

Это должно сработать.

person Chris    schedule 20.01.2016
comment
контроллеры имеют метод проверки, который генерирует исключение, вам не нужно переходить на создание валидатора самостоятельно. - person lagbox; 20.01.2016