Laravel 5.2にアップグレードした後、laravelバリデーターで問題が発生しました。コントローラーのデータを検証する場合は、このコードを例にとります。
<?php
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
class ContactController extends Controller
{
public function storeContactRequest(Request $request)
{
$this->validate($request, [
'_token' => 'required',
'firstname' => 'required|string'
'lastname' => 'required|string'
'age' => 'required|integer',
'message' => 'required|string'
]);
// Here to store the message.
}
}
しかし、どういうわけか無効なデータを入力すると、前のページにリダイレクトされず、一部のメッセージがセッションにフラッシュされませんが、例外がトリガーされ、500エラーページが返されます。
これは私が得る例外です。 HttpResponseExceptionの代わりにValidationExceptionが新しいことをドキュメントで読みましたが、これに何か関係があるかどうかはわかりません。
[2016-01-05 11:49:49] production.ERROR: exception 'Illuminate\Foundation\Validation\ValidationException' with message 'The given data failed to pass validation.' in /home/vagrant/Code/twentyre-webshop/vendor/laravel/framework/src/Illuminate/Foundation/Validation/ValidatesRequests.php:70
そして、別のリクエストクラスを使用すると、エラーメッセージでリダイレクトされます。コントローラーで使用される検証メソッドのみがこの動作の影響を受けるようです。
App\Exceptions\Handler
クラス
use Illuminate\Auth\Access\AuthorizationException;
use Illuminate\Database\Eloquent\ModelNotFoundException;
use Symfony\Component\HttpKernel\Exception\HttpException;
use Illuminate\Foundation\Validation\ValidationException;
/**
* A list of the exception types that should not be reported.
*
* @var array
*/
protected $dontReport = [
AuthorizationException::class,
HttpException::class,
ModelNotFoundException::class,
ValidationException::class,
];
また、laravel 5.2に移行する方法のドキュメントを読むことをお勧めします。これは、いくつかの重大な変更があったためです。たとえば、ValidatesRequests
trait throws Illuminate\Foundation\Validation\ValidationException
の代わりに Illuminate\Http\Exception\HttpResponseException
Laravel 5.1から5.2 への移行方法に関するドキュメント
laravel docsの例。 Validatorファサードを使用して、カスタム検証が動作を失敗させることができます
public function store(Request $request)
{
$validator = Validator::make($request->all(), [
'title' => 'required|unique:posts|max:255',
'body' => 'required',
]);
if ($validator->fails()) {
return redirect('post/create')
->withErrors($validator)
->withInput();
}
// Store the blog post...
}
これは私がLaravel 5.3(Handler.php
)
laravel 5.2の場合、次の行を追加する必要がありました。
if ($e instanceof ValidationException)
{
return redirect()->back()->withInput();
}
App\Exceptions\Handler.phpと次のヘッダー:
use Illuminate\Session\TokenMismatchException;
use Illuminate\Database\Eloquent\ModelNotFoundException;
use Symfony\Component\HttpKernel\Exception\HttpException;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
use Illuminate\Validation\ValidationException;
use Illuminate\Auth\AuthenticationException;
私の目的のために、私は手動でLaravel 5.1からアップグレードしたLaravel 5.3で完全にAPIベースのアプリケーションを構築していました。と私はLaravelが必要で、FormRequestの修正が必要な検証エラーで応答する必要がありました。
この行を追加します。
elseif ($e instanceof ValidationException)
{
return $this->convertValidationExceptionToResponse($e, $request);
}
この後:
if ($e instanceof ModelNotFoundException) {
$e = new NotFoundHttpException($e->getMessage(), $e);
}
App\Exceptions\Handler.php
は私のためにトリックを行い、FormRequest検証を使用すると予想される検証エラーを返しました。
ここに私のコメントを参照してください: @ gitatatKEのgithubへのコメント