Reputation: 2530
When I Validate an incoming request in Laravel 5.x, if the validation fails, a Symfony\Component\HttpKernel\Exception\NotFoundHttpException
is raised instead of the expected HttpResponseException
.
If I replace the
throw new HttpResponseException($this->buildFailedValidationResponse(
$request, $this->formatValidationErrors($validator)
));
code from the validator trait with any other exception, it just works well...
routes
// User login (logout is handled by frontend)
Route::post('login', [
'as' => 'login',
'uses' => 'Auth\AuthController@login'
]);
Controller
/**
* Login user.
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Contracts\Routing\ResponseFactory|\Symfony\Component\HttpFoundation\Response
* @throws \App\Exceptions\AuthenticationFailedException
*/
public function login(Request $request)
{
$this->validate($request, [
'username' => ['required'],
'password' => ['required'],
]);
$credentials = $request->only('username', 'password');
if (!$this->auth->once($credentials)) {
// something went wrong whilst attempting to encode the token
throw new AuthenticationFailedException;
}
$token = $this->jwt->fromUser($this->auth->user(), [
'permissions' => $this->auth->user()->role,
'name' => $this->auth->user()->name
]);
return response(compact('token'));
}
Exception
[2015-07-02 07:42:20] local.ERROR: exception 'Symfony\Component\HttpKernel\Exception\NotFoundHttpException' in /var/www/public/project/vendor/laravel/framework/src/Illuminate/Routing/RouteCollection.php:143
Stack trace:
#0 /var/www/public/project/vendor/laravel/framework/src/Illuminate/Routing/Router.php(746): Illuminate\Routing\RouteCollection->match(Object(Illuminate\Http\Request))
#1 /var/www/public/project/vendor/laravel/framework/src/Illuminate/Routing/Router.php(655): Illuminate\Routing\Router->findRoute(Object(Illuminate\Http\Request))
#2 /var/www/public/project/vendor/laravel/framework/src/Illuminate/Routing/Router.php(631): Illuminate\Routing\Router->dispatchToRoute(Object(Illuminate\Http\Request))
#3 /var/www/public/project/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(229): Illuminate\Routing\Router->dispatch(Object(Illuminate\Http\Request))
#4 [internal function]: Illuminate\Foundation\Http\Kernel->Illuminate\Foundation\Http\{closure}(Object(Illuminate\Http\Request))
#5 /var/www/public/project/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(139): call_user_func(Object(Closure), Object(Illuminate\Http\Request))
#6 /var/www/public/project/vendor/laravel/framework/src/Illuminate/View/Middleware/ShareErrorsFromSession.php(54): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#7 [internal function]: Illuminate\View\Middleware\ShareErrorsFromSession->handle(Object(Illuminate\Http\Request), Object(Closure))
#8 /var/www/public/project/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(124): call_user_func_array(Array, Array)
#9 /var/www/public/project/vendor/laravel/framework/src/Illuminate/Session/Middleware/StartSession.php(62): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#10 [internal function]: Illuminate\Session\Middleware\StartSession->handle(Object(Illuminate\Http\Request), Object(Closure))
#11 /var/www/public/project/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(124): call_user_func_array(Array, Array)
#12 /var/www/public/project/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/CheckForMaintenanceMode.php(42): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#13 [internal function]: Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode->handle(Object(Illuminate\Http\Request), Object(Closure))
#14 /var/www/public/project/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(124): call_user_func_array(Array, Array)
#15 /var/www/public/project/app/Http/Middleware/ApiSession.php(24): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#16 [internal function]: App\Http\Middleware\ApiSession->handle(Object(Illuminate\Http\Request), Object(Closure))
#17 /var/www/public/project/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(124): call_user_func_array(Array, Array)
#18 [internal function]: Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#19 /var/www/public/project/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(103): call_user_func(Object(Closure), Object(Illuminate\Http\Request))
#20 /var/www/public/project/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(118): Illuminate\Pipeline\Pipeline->then(Object(Closure))
#21 /var/www/public/project/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(86): Illuminate\Foundation\Http\Kernel->sendRequestThroughRouter(Object(Illuminate\Http\Request))
#22 /var/www/public/project/public/index.php(54): Illuminate\Foundation\Http\Kernel->handle(Object(Illuminate\Http\Request))
#23 {main}
Someone have an idea ? I can't find anything on the laracast forum or github issues
Upvotes: 2
Views: 1288
Reputation: 17553
This issue may occur when Laravel tries to redirect back to a page/form that does not exist with some error message.
You probably get this error when you post a form with postman
or similar test utility.
If you are trying to build an API that must return a JSON object, you could modify FormRequest
like so:
Edit app\Http\Requests\Requests.php
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Http\JsonResponse;
abstract class Request extends FormRequest
{
/**
* Get the proper failed validation response for the request.
*
* @param array $errors
* @return \Symfony\Component\HttpFoundation\Response
*/
public function response(array $errors)
{
//This will always return JSON object error messages
return new JsonResponse($errors, 422);;
}
}
Upvotes: 2