@kulerezzz

Как настроить вывод ошибок после валидации в Laravel?

При отправке формы ....

@if (count($errors) > 0)
  <div class="alert alert-danger">
    <ul>
    @foreach ($errors->all() as $error)
      <li>{{ $error }}</li>
    @endforeach
    </ul>
  </div>
@endif
<form method="post" action="/regcontractor" name="regcompany">
<input type="hidden" name="formOfOwnership" value="company">
<input type="hidden" name="_token" value="{{ csrf_token() }}">
<div class="panel panel-default company">
<table class="table">
<tr>
<td class="nameField">Email*</td>
<td class="field"><input class="form-control" type="text" name="email" value="{{ old('email') }}" required><small>Будет использоваться для входа</small></td>
</tr>
<tr>
<td class="nameField">Пароль*</td>
<td class="field"><input class="form-control" type="password" name="password" required></td>
</tr>
<tr>
<td class="nameField">Повторите пароль*</td>
<td class="field"><input class="form-control" type="password" name="reenterpassword" required></td>
</tr>
<tr>
<td></td>
<td>
<p><button type="submit" class="btn btn-default btn-lg"><span class="glyphicon glyphicon-ok"></span>&nbsp&nbspРегистрация</button></p></td>
</tr>
</table>
</div>
</form>


.... методом POST срабатывает роутер ....

Route::post('/regcontractor', "Contractor@registration");


... вызывающий контроллер ...

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use App\Http\Requests;
use App\Http\Controllers\Controller;

use Validator;

class Contractor extends Controller
{
    public function registration (Request $request)
    {

    	$title="Регистрация";

    	if ($request->isMethod('post')) 
    	{
    		$rules = 
    		[
    		
    			'email'=>'required|email',
    			'password'=>'required',
    			'reenterpassword'=>'required',

    		];

    		$this->validate($request, $rules);

    		return view('regcontractor',['title'=>$title]);

    	}

    }


Файл \app\Http\Kernel.php

namespace App\Http;

use Illuminate\Foundation\Http\Kernel as HttpKernel;

class Kernel extends HttpKernel
{
    /**
     * The application's global HTTP middleware stack.
     *
     * These middleware are run during every request to your application.
     *
     * @var array
     */
    protected $middleware = [
        \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
        \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
        \App\Http\Middleware\TrimStrings::class,
        \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
        \Illuminate\Session\Middleware\StartSession::class,
        \Illuminate\View\Middleware\ShareErrorsFromSession::class
    ];

    /**
     * The application's route middleware groups.
     *
     * @var array
     */
    protected $middlewareGroups = [
        'web' => [
            \App\Http\Middleware\EncryptCookies::class,
            \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
            \Illuminate\Session\Middleware\StartSession::class,
            // \Illuminate\Session\Middleware\AuthenticateSession::class,
            \Illuminate\View\Middleware\ShareErrorsFromSession::class,
            \App\Http\Middleware\VerifyCsrfToken::class,
            \Illuminate\Routing\Middleware\SubstituteBindings::class,
        ],

        'api' => [
            'throttle:60,1',
            'bindings',
        ],
    ];

    /**
     * The application's route middleware.
     *
     * These middleware may be assigned to groups or used individually.
     *
     * @var array
     */
    protected $routeMiddleware = [
        'auth' => \Illuminate\Auth\Middleware\Authenticate::class,
        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
        'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
        'can' => \Illuminate\Auth\Middleware\Authorize::class,
        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
        'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
    ];
}


В $middleware прописаны классы \Illuminate\Session\Middleware\StartSession::class, \Illuminate\View\Middleware\ShareErrorsFromSession::class

Но ошибки из $errors в виде не показываются, как и валидные значения, которые ввел пользователь ({{ old('имя поля') }}). В чем может быть проблема?
  • Вопрос задан
  • 6831 просмотр
Решения вопроса 1
@kulerezzz Автор вопроса
После суточного танца с бубнами и вызова пяти экстрасенсов, решением вопроса оказалось проставление в каждом теге input атрибута id, значение которого и берется для составления объекта $errors
Пример:
<input class="form-control" type="text" name="email" value="{{ old('email') }}" id="email">

Также все-таки необходимо убрать подгрузку \Illuminate\Session\Middleware\StartSession::class, \Illuminate\View\Middleware\ShareErrorsFromSession::class в protected $middleware.
1397759758_747400265.jpg
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
Palych_tw
@Palych_tw
Типа веб-разработчик
В контроллере вместо
$this->validate($request, $rules);
вот так
$validator = Validator::make($request->all(), $rules]);
        if ($validator->fails()) {
            return redirect()->back()->withErrors($validator)->withInput();
        }


Хотя и первый вариант тоже должен возвращать и ошибки и старый ввод

И где у вас ретурн вьюхи если метод НЕ POST, вынесете return view('regcontractor',['title'=>$title]); за пределы условия if, и добавьте get маршрут на эту страницу

И для подтверждения пароля лучше использовать правило confirmed https://laravel.com/docs/5.4/validation#rule-confirmed

А какая версия laravel? В 5.2 точно всем маршрутам по умолчанию дается группа web. А вы старт сессий еще дополнительно глобально в посредники записали. Из-за этого могут быть глюки с сессиями
Ответ написан
@vism
вот как работает редирект после валидации.
return redirect()->to($this->getRedirectUrl())
                        ->withInput($request->input())
                        ->withErrors($errors, $this->errorBag());

покажите метод и вьюшку, которая отображает форму.
Т.к. то что вы выложили работает только по посту
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы