Laravel 5 API с Динго

Я строю API, используя Laravel 5 и Dingo. Как мне перехватить запросы, для которых не определен маршрут? Я хочу, чтобы мой API всегда отвечал специально отформатированным ответом JSON.

Например, если у меня есть маршрут: $api->get( 'somepage','mycontroller@mymethod');

Как мне обработать случай, когда кто-то создает сообщение в том же URI, предполагая, что маршрут не определен?

По сути, Laravel создает исключение MethodNotAllowedHttpException.

Я попробовал это:

    Route::any('/{all}', function ($all) 
    {
        $errorResponse = [
            'Message' => 'Error',
            'Error' => ['data' => 'Sorry, that resource is not found or the method is not allowed.' ]
        ];
        return Response::json($errorResponse, 400);     //400 = Bad Request
    })->where(['all' => '.*']);

но я продолжаю получать исключение MethodNotAllowedHttpException.

Есть ли способ, которым я могу сделать это? Используя Middleware? Какой-то другой вид ловли на всем пути?

РЕДАКТИРОВАТЬ:

Попытался добавить это в app\Exceptions\Handler.php

public function render($request, Exception $e)
{
    dd($e);
    if ($e instanceof MethodNotAllowedHttpException) {
        $errorResponse = [
            'Message' => 'Error',
            'Error' => ['data' => 'Sorry, that resource is not found or the method is not allowed.' ]
        ];
        return Response::json($errorResponse, 400);
    }
    return parent::render($request, $e);        
}

Это не имело никакого эффекта. Я сделал дамп-автозагрузку и все такое. Я даже добавил дд ($ е), и это не имело никакого эффекта. Это кажется странным для меня.

РЕДАКТИРОВАТЬ - РЕШЕНИЕ

Догадаться. В то время как ответ Джеймса заставил меня задуматься в правильном направлении, произошло то, что Динго перевесил обработку ошибок. Чтобы настроить ответ на эту ошибку, необходимо изменить app\Providers\AppServiceProvider.php. Сделайте загрузочную функцию такой (по умолчанию она пуста)

public function boot()
{
    app('Dingo\Api\Exception\Handler')->register(function (MethodNotAllowedHttpException $exception) {
         $errorResponse = [
            'Message' => 'Error',
            'Error' => ['data' => 'Sorry, that resource is not found or the method is not allowed.' ]
        ];
        return Response::make($errorResponse, 400);
    });
}

Принятие ответа Джеймса, потому что это заставило меня двигаться в правильном направлении.

Надеюсь, это поможет кому-то:) Это заняло лучшую часть моей ночи.... тьфу

1 ответ

Решение

Вы можете сделать это внутри app/Exceptions/Handler.php перехватывая исключение и проверяя, является ли он экземпляром MethodNotAllowedHttpException,

Если это так, вы можете выполнить логику, чтобы вернуть свой собственный ответ об ошибке.

Там же вы можете настроить свой чек, если хотите поймать экземпляры NotFoundHttpException,

// app/Exceptions/Handler.php

public function render($request, Exception $e)
    {
        if ($e instanceof MethodNotAllowedHttpException) {
            $errorResponse = [
                'Message' => 'Error',
                'Error' => ['data' => 'Sorry, that resource is not found or the method is not allowed.' ]
            ];
            return Response::json($errorResponse, 400);
        }

        if($e instanceof NotFoundHttpException)
        {
            $errorResponse = [
                'Message' => 'Error',
                'Error' => ['data' => 'Sorry, that resource is not found or the method is not allowed.' ]
            ];
            return Response::json($errorResponse, 400);
        }

        return parent::render($request, $e);
    }
Другие вопросы по тегам