паспорт laravel как элегантно обрабатывать ошибки - PullRequest
0 голосов
/ 26 февраля 2019

Я пытаюсь использовать паспорт laravel5.7 + для своего API-сервера (пакет dingo не совместим с некоторыми из моих пакетов, я должен отказаться от него).Я хочу, чтобы глобальный элемент был более совместим с обработкой ошибок API, поэтому я изменил App\Exceptions\Handler.

<?php

namespace App\Exceptions;

use Exception;
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;

class Handler extends ExceptionHandler
{

    /**
     * A list of the exception types that are not reported.
     *
     * @var array
     */
    protected $dontReport = [
        //
    ];

    /**
     * A list of the inputs that are never flashed for validation exceptions.
     *
     * @var array
     */
    protected $dontFlash = [
        'password',
        'password_confirmation',
    ];

    /**
     * Report or log an exception.
     *
     * @param  \Exception  $exception
     * @return void
     */
    public function report(Exception $exception)
    {
        parent::report($exception);
    }

    /**
     * Render an exception into an HTTP response.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Exception  $exception
     * @return \Illuminate\Http\Response
     */
    public function render($request, Exception $exception)
    {
        // Determine whether it is an API interface
        if($request->is('api/*')) {
            $response = [];
            $error = $this->convertExceptionToResponse($exception);
            $response['message'] = $exception->getMessage();
            $response['status_code'] = $error->getStatusCode();
            if(config('app.debug')) {
                if($error->getStatusCode() >= 500) {
                    $response['debug']['line'] = $exception->getLine(); // error line
                    $response['debug']['file'] = $exception->getFile(); // error file
                    $response['debug']['class'] = get_class($exception); // error position
                    $response['debug']['trace'] = explode("\n", $exception->getTraceAsString()); //Error stack
                }
            }
            // response api
            return response()->json($response, $error->getStatusCode());
        } else {
            // response web
            return parent::render($request, $exception);
        }
    }
}

подробности ошибки:

{
    "message": "Unauthenticated.",
    "status_code": 500,
    "debug": {
        "line": 67,
        "file": "/Users/noecs/Desktop/noecsSystemLaravel/vendor/laravel/framework/src/Illuminate/Auth/Middleware/Authenticate.php",
        "class": "Illuminate\\Auth\\AuthenticationException",
        "trace": [
            "#0 /Users/noecs/Desktop/noecsSystemLaravel/vendor/laravel/framework/src/Illuminate/Auth/Middleware/Authenticate.php(41): Illuminate\\Auth\\Middleware\\Authenticate->authenticate(Object(Illuminate\\Http\\Request), Array)",
            "#1 /Users/noecs/Desktop/noecsSystemLaravel/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(163): Illuminate\\Auth\\Middleware\\Authenticate->handle(Object(Illuminate\\Http\\Request), Object(Closure), 'api')",
            "#2 /Users/noecs/Desktop/noecsSystemLaravel/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))",
            "#3 /Users/noecs/Desktop/noecsSystemLaravel/vendor/laravel/framework/src/Illuminate/Routing/Middleware/ThrottleRequests.php(58): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))",
            "#4 /Users/noecs/Desktop/noecsSystemLaravel/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(163): Illuminate\\Routing\\Middleware\\ThrottleRequests->handle(Object(Illuminate\\Http\\Request), Object(Closure), 60, '1')",
            "#5 /Users/noecs/Desktop/noecsSystemLaravel/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))",
            "#6 /Users/noecs/Desktop/noecsSystemLaravel/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(104): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))",
            "#7 /Users/noecs/Desktop/noecsSystemLaravel/vendor/laravel/framework/src/Illuminate/Routing/Router.php(684): Illuminate\\Pipeline\\Pipeline->then(Object(Closure))",
            "#8 /Users/noecs/Desktop/noecsSystemLaravel/vendor/laravel/framework/src/Illuminate/Routing/Router.php(659): Illuminate\\Routing\\Router->runRouteWithinStack(Object(Illuminate\\Routing\\Route), Object(Illuminate\\Http\\Request))",
            "#9 /Users/noecs/Desktop/noecsSystemLaravel/vendor/laravel/framework/src/Illuminate/Routing/Router.php(625): Illuminate\\Routing\\Router->runRoute(Object(Illuminate\\Http\\Request), Object(Illuminate\\Routing\\Route))",
            "#10 /Users/noecs/Desktop/noecsSystemLaravel/vendor/laravel/framework/src/Illuminate/Routing/Router.php(614): Illuminate\\Routing\\Router->dispatchToRoute(Object(Illuminate\\Http\\Request))",
            "#11 /Users/noecs/Desktop/noecsSystemLaravel/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(176): Illuminate\\Routing\\Router->dispatch(Object(Illuminate\\Http\\Request))",
            "#12 /Users/noecs/Desktop/noecsSystemLaravel/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(30): Illuminate\\Foundation\\Http\\Kernel->Illuminate\\Foundation\\Http\\{closure}(Object(Illuminate\\Http\\Request))",
            "#13 /Users/noecs/Desktop/noecsSystemLaravel/vendor/fideloper/proxy/src/TrustProxies.php(57): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))",
            "#14 /Users/noecs/Desktop/noecsSystemLaravel/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(163): Fideloper\\Proxy\\TrustProxies->handle(Object(Illuminate\\Http\\Request), Object(Closure))",
            "#15 /Users/noecs/Desktop/noecsSystemLaravel/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))",
            "#16 /Users/noecs/Desktop/noecsSystemLaravel/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(31): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))",
            "#17 /Users/noecs/Desktop/noecsSystemLaravel/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(163): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle(Object(Illuminate\\Http\\Request), Object(Closure))",
            "#18 /Users/noecs/Desktop/noecsSystemLaravel/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))",
            "#19 /Users/noecs/Desktop/noecsSystemLaravel/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(31): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))",
            "#20 /Users/noecs/Desktop/noecsSystemLaravel/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(163): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle(Object(Illuminate\\Http\\Request), Object(Closure))",
            "#21 /Users/noecs/Desktop/noecsSystemLaravel/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))",
            "#22 /Users/noecs/Desktop/noecsSystemLaravel/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ValidatePostSize.php(27): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))",
            "#23 /Users/noecs/Desktop/noecsSystemLaravel/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(163): Illuminate\\Foundation\\Http\\Middleware\\ValidatePostSize->handle(Object(Illuminate\\Http\\Request), Object(Closure))",
            "#24 /Users/noecs/Desktop/noecsSystemLaravel/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))",
            "#25 /Users/noecs/Desktop/noecsSystemLaravel/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/CheckForMaintenanceMode.php(62): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))",
            "#26 /Users/noecs/Desktop/noecsSystemLaravel/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(163): Illuminate\\Foundation\\Http\\Middleware\\CheckForMaintenanceMode->handle(Object(Illuminate\\Http\\Request), Object(Closure))",
            "#27 /Users/noecs/Desktop/noecsSystemLaravel/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))",
            "#28 /Users/noecs/Desktop/noecsSystemLaravel/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(104): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))",
            "#29 /Users/noecs/Desktop/noecsSystemLaravel/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(151): Illuminate\\Pipeline\\Pipeline->then(Object(Closure))",
            "#30 /Users/noecs/Desktop/noecsSystemLaravel/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(116): Illuminate\\Foundation\\Http\\Kernel->sendRequestThroughRouter(Object(Illuminate\\Http\\Request))",
            "#31 /Users/noecs/Desktop/noecsSystemLaravel/vendor/swooletw/laravel-swoole/src/Server/Sandbox.php(257): Illuminate\\Foundation\\Http\\Kernel->handle(Object(Illuminate\\Http\\Request))",
            "#32 /Users/noecs/Desktop/noecsSystemLaravel/vendor/swooletw/laravel-swoole/src/Server/Sandbox.php(196): SwooleTW\\Http\\Server\\Sandbox->handleRequest(Object(Illuminate\\Http\\Request))",
            "#33 /Users/noecs/Desktop/noecsSystemLaravel/vendor/swooletw/laravel-swoole/src/Server/Sandbox.php(182): SwooleTW\\Http\\Server\\Sandbox->prepareResponse(Object(Illuminate\\Http\\Request))",
            "#34 /Users/noecs/Desktop/noecsSystemLaravel/vendor/swooletw/laravel-swoole/src/Server/Manager.php(221): SwooleTW\\Http\\Server\\Sandbox->run(Object(Illuminate\\Http\\Request))",
            "#35 {main}"
        ]
    }
}

Я попытался ввести неправильный tokenв соответствии со спецификацией разработки API, я должен вернуть TOKEN ошибки 401.Но помимо моих ожиданий, вывод программы - ошибка 500.Это меня очень смущает, я не знаю, как изящно обработать сообщение об ошибке этого API.

...