wake-up-neo.com

Laravel 5.2 Validierungsfehler

Ich habe Probleme mit der Validierung in Laravel 5.2. Wenn ich versuche, die Anfrage im Controller so zu validieren

$this->validate($request, [
                'title' => 'required',
                'content.*.rate' => 'required',
            ]);

Validator-Catch-Fehler, aber nicht in der Sitzung speichern. Wenn ich also versuche, diesen Code in template aufzurufen

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

Laravel wirft den Fehler

Undefined variable: errors (View: /home/vagrant/Code/os.dev/resources/views/semantic/index.blade.php)

Wenn ich versuche, mit diesem Code zu validieren 

 $validator = Validator::make($request->all(), [
                'title' => 'required',
                'content.*.rate' => 'required'
            ]);

            if ($validator->fails()) {
                return redirect()
                    ->back()
                    ->withInput($request->all())
                    ->withErrors($validator, 'error');
            }

Variable $ error auch nicht in der Vorlage vorhanden, aber wenn ich versuche, Fehler im Controller anzuzeigen

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

Fehler werden angezeigt, aber ich kann nicht auf die Vorlage zugreifen.

Was ist falsch?

21
Dmitry

Update ab Laravel 5.2.27

Laravel unterstützt jetzt standardmäßig die Web-Middleware, wie Sie hier sehen können: source

Mit anderen Worten, Sie müssen Ihre Routen nicht mehr um die Web-Middleware-Gruppe wickeln, da dies in der RouteServiceProvider-Datei für Sie erledigt wird. Wenn Sie jedoch eine Version von Laravel zwischen 5.2.0 und 5.2.26 verwenden, beziehen Sie sich auf die folgende Methode:

Below gilt nur für Laravel 5.2.0 bis 5.2.26

Ohne Ihre routes.php- oder Kernel.php-Datei zu sehen, vermute ich Folgendes.

Die Funktionsweise von Middlewares hat sich von 5.2 auf 5.1 geändert. In 5.1 sehen Sie dies in Ihrer app/Http/Kernel.php-Datei:

protected $middleware = [
    \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
    \App\Http\Middleware\EncryptCookies::class,
    \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
    \Illuminate\Session\Middleware\StartSession::class,
    \Illuminate\View\Middleware\ShareErrorsFromSession::class,
    \App\Http\Middleware\VerifyCsrfToken::class,
];

Dieses Array ist der globale HTTP-Middleware-Stack Ihrer Anwendung. Mit anderen Worten, sie laufen auf every -Anforderung. Notieren Sie sich diese bestimmte Middleware: Illuminate\View\Middleware\ShareErrorsFromSession. Dadurch wird bei jeder Anforderung die Variable $errors hinzugefügt.

In 5.2 wurden jedoch Änderungen vorgenommen, um sowohl eine Web-Benutzeroberfläche als auch eine API in derselben Anwendung zu ermöglichen. Nun sehen Sie das in derselben Datei:

protected $middleware = [
    \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
];

protected $middlewareGroups = [
    'web' => [
        \App\Http\Middleware\EncryptCookies::class,
        \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
        \Illuminate\Session\Middleware\StartSession::class,
        \Illuminate\View\Middleware\ShareErrorsFromSession::class,
        \App\Http\Middleware\VerifyCsrfToken::class,
    ],

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

Der globale Middleware-Stack prüft jetzt nur noch die Wartung. Sie haben jetzt eine Middleware-Gruppe namens "Web", die einen Großteil der vorherigen globalen Middleware enthält. Denken Sie daran, dass es so ist, sowohl eine Webbenutzeroberfläche als auch eine API in derselben Anwendung zuzulassen.

Wie bekommen wir diese $errors-Variable zurück?

In Ihrer Routendatei müssen Sie Ihre Routen in der Middleware-Gruppe "Web" hinzufügen, damit Sie bei jeder Anforderung auf diese $errors-Variable zugreifen können. So was:

Route::group(['middleware' => ['web']], function () {
    // Add your routes here
});

Wenn Sie keine API erstellen möchten, können Sie die "Web" Middlewares wie in 5.1 auf den globalen Middleware-Stack verschieben.

49
Thomas Kim

Versuchen Sie es mit 

return redirect()->back()
              ->withInput($request->all())
              ->withErrors($validator->errors()); // will return only the errors
4

Versuchen Sie zu ersetzen:

->withErrors($validator, 'error');

mit:

->withErrors($validator);
3
// Replace

Route::group(['middleware' => ['web']], function () {
    // Add your routes here
});

// with 

Route::group(['middlewareGroups' => ['web']], function () {
    // Add your routes here
});
2
Alex

Ich habe meinen Arbeitsbestätigungscode in Laravel 5.2 wie folgt

erstellen Sie zunächst eine Funktion in diesem Modell

Fügen Sie im Modell diese Codezeile beim Start hinzu

benutze Illuminate\Support\Facades\Validator;

public static function validate($input) {

            $rules = array(
                'title' => 'required',
                'content.*.rate' => 'required',
              );
            return Validator::make($input, $rules);
        }

und im Controller diese Funktion aufrufen, um die Eingabe zu bestätigen

benutze Illuminate\Support\Facades\Redirect;

  $validate = ModelName::validate($inputs);
    if ($validate->passes()) {
          ///some code
     }else{
           return Redirect::to('Route/URL')
                            ->withErrors($validate)
                            ->withInput();
      }

Nun kommt der Vorlagenteil

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

und vor allem, was du deine Route so schreiben musst

Route::group(['middleware' => ['web']], function () {

    Route::resource('RouteURL', 'ControllerName');
});
0
Bindesh Pandya

//Das wird funktionieren

   Route::group(['middlewareGroups' => ['web']], function () {

// Add your routes here
});

// sowie das funktioniert auch

Route::post('location',array(
'as'=>'location',
'middlewareGroups'=>'web',
'uses'=>'[email protected]'
));
0
user6463929
// Controller

  $this->validateWith([
      'title' => 'required',
      'content.*.rate' => 'required',
  ]);


// Blade Template

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

Finden Sie die Dokumentation .

0
Eazy Sam
Route::group(['middlewareGroups' => ['web']], function () {
    // Add your routes here
    Route::resource('/post', 'PostController');
});


public function store(Request $request){
   $this->validate($request, [
       //input field names
      'title' => 'required|max:20',
      'body' => 'required',
   ]);
}

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

Wickeln Sie Ihre Routen in web-Middleware wie folgt:

Route::group(['middleware' => ['web']], function () { // Add your routes here });

und in app\Http\Kernel.php bewegen Sie \Illuminate\Session\Middleware\StartSession::class von web$middlewareGroups nach $middleware Ich hoffe, es löst Ihr Problem.

0
Bashar