web-dev-qa-db-ja.com

Laravelバリデータは、リダイレクトする代わりに例外をスローします

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

そして、別のリクエストクラスを使用すると、エラーメッセージでリダイレクトされます。コントローラーで使用される検証メソッドのみがこの動作の影響を受けるようです。

13
DB93

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 への移行方法に関するドキュメント

5
xAoc

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...
}
3
Nickstery

これは私がLaravel 5.3(Handler.php

https://stackoverflow.com/a/42852358/3107185

1
Rav

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;
0
Eduardo Lemus

私の目的のために、私は手動で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へのコメント

0
Moses Ndeda