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());
}
エラーは表示されますが、テンプレートからエラーにアクセスできません。
どうしましたか?
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のように「ウェブ」ミドルウェアをグローバルミドルウェアスタックに移動することもできます。
使用してみてください
return redirect()->back()
->withInput($request->all())
->withErrors($validator->errors()); // will return only the errors
交換してみてください:
->withErrors($validator, 'error');
で:
->withErrors($validator);
// Replace
Route::group(['middleware' => ['web']], function () {
// Add your routes here
});
// with
Route::group(['middlewareGroups' => ['web']], function () {
// Add your routes here
});
laravel 5.2このように動作検証コードを持っています
まず、このようなモデルで関数を作成します
public static function validate($input) {
$rules = array(
'title' => 'required',
'content.*.rate' => 'required',
);
return Validator::make($input, $rules);
}
そしてコントローラーでこの関数を呼び出して入力を検証します
$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');
});
//これは動作します
Route::group(['middlewareGroups' => ['web']], function () {
// Add your routes here
});
//同様にこれも機能します
Route::post('location',array(
'as'=>'location',
'middlewareGroups'=>'web',
'uses'=>'myController@function'
));
// 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
ドキュメント を見つけます。
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
以下のようにweb
ミドルウェアでルートをラップします。
Route::group(['middleware' => ['web']], function () { // Add your routes here });
およびapp\Http\Kernel.php
で\Illuminate\Session\Middleware\StartSession::class
をweb
$middlewareGroups
から$middleware
に移動して、問題が解決することを願っています。