kitensei
kitensei

Reputation: 2530

Laravel 5 HttpNotFoundException

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

Answers (1)

Emeka Mbah
Emeka Mbah

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

Related Questions