web-dev-qa-db-ja.com

Laravel 5.2検証エラー

Laravel 5.2で検証に問題があります

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

バリデーターはエラーをキャッチしますが、セッションに保存しないため、テンプレートでこのコードを呼び出そうとすると

 @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はエラーを投げます

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

このコードで検証しようとすると

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

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

変数$ errorもテンプレートでは使用できませんが、コントローラーでエラーを表示しようとすると

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

エラーは表示されますが、テンプレートからエラーにアクセスできません。

どうしましたか?

21
Dmitry

Laravel 5.2.27の時点で更新

Laravelは、次のようにデフォルトでWebミドルウェアをサポートするようになりました。 source

つまり、RouteServiceProviderファイルで自動的にルートを行うため、Webミドルウェアグループにルートをラップする必要がなくなります。ただし、Laravel 5.2.0と5.2.26の間のバージョンを使用している場合は、以下のメソッドを参照してください。

以下はLaravel 5.2.0から5.2.26にのみ適用されます

routes.phpまたはKernel.phpファイルが表示されない場合、ここで問題が発生していると思われます。

ミドルウェアの動作方法は5.2および5.1から変更されました。 5.1では、app/Http/Kernel.phpファイルに次のように表示されます。

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,
];

この配列は、アプリケーションのグローバルHTTPミドルウェアスタックです。つまり、everyリクエストで実行されます。この特定のミドルウェアで注意してください:Illuminate\View\Middleware\ShareErrorsFromSession。これは、リクエストごとに$errors変数を追加するものです。

ただし、5.2では、同じアプリケーション内でWeb UIとAPIの両方を許可するように状況が変わりました。これで、同じファイルにこれが表示されます。

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',
    ],
];

グローバルミドルウェアスタックは、メンテナンスのみをチェックするようになりました。これで、以前のグローバルミドルウェアの大部分を含む「web」というミドルウェアグループができました。同じアプリケーション内でWeb UIとAPIの両方を許可するのはこのようなことです。

では、どのようにして$errors変数を取り戻すことができますか?

Routesファイルでは、リクエストごとに$errors変数にアクセスできるように、「web」ミドルウェアグループ内にルートを追加する必要があります。このような:

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

APIを構築しない場合は、5.1のように「ウェブ」ミドルウェアをグローバルミドルウェアスタックに移動することもできます。

49
Thomas Kim

使用してみてください

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

交換してみてください:

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

で:

->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

laravel 5.2このように動作検証コードを持っています

まず、このようなモデルで関数を作成します

モデルでは、開始時にこのコード行を追加します

illuminate\Support\Facades\Validatorを使用します。

public static function validate($input) {

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

そしてコントローラーでこの関数を呼び出して入力を検証します

illuminate\Support\Facades\Redirectを使用します。

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

今ここにテンプレート部分があります

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

そして何よりも、このようにルートを書く必要があります

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

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

//これは動作します

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

// Add your routes here
});

//同様にこれも機能します

Route::post('location',array(
'as'=>'location',
'middlewareGroups'=>'web',
'uses'=>'myController@function'
));
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

ドキュメント を見つけます。

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

以下のようにwebミドルウェアでルートをラップします。

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

およびapp\Http\Kernel.php\Illuminate\Session\Middleware\StartSession::classweb$middlewareGroupsから$middlewareに移動して、問題が解決することを願っています。

0
Bashar