Slim: как поймать недопустимые маршруты?

0

Я установил простой сервис RESTful с Slim.
Это отрывок из моей маршрутизации:

...
$app->get('/persons/get', function() { getPersons(); });
$app->get('/persons/get/:id', function($id) { getPerson($id); });
$app->put('/persons/setprop/:id/:prop', function($id) { setPersonProp($id); });

$app->options('/.+', function() { options(); });

$app->run();

Если я получу непредвиденный запрос, Slim отвечает с кодом статуса 405 не разрешенного кода HTTP.
Как я могу уловить непредвиденные запросы, настроить ответ?

ОБНОВИТЬ:
Как предложил @Martin Turjak, я добавил методы error() и notFound(), так что это мой текущий код:

...
$app->get('/persons/get', function() { getPersons(); });
$app->get('/persons/get/:id', function($id) { getPerson($id); });
$app->put('/persons/setprop/:id/:prop', function($id) { setPersonProp($id); });

$app->options('/.+', function() { options(); });

$app->error(function(Exception $e) {
    echo("Error:");
    var_dump($e);
});
$app->notFound(function() {
    echo("Not Found!");
});

$app->run();

По какой-то причине и $app-> notFound() и $app-> error(), похоже, зарегистрированы... Я продолжаю получать ошибку 405 для неправильных маршрутов... :-(
Например, вызов http://localhost/myapp/api/persons/NOT_EXISTING_ROUTE

Примечание. В настоящее время я тестирую Slim-сервис из того же домена, но мне тоже нужно работать в междоменном режиме...

Теги:
http
slim

2 ответа

6

Обычно, если маршрут не совпадает с запросом, вызывается 404 Not Found... который вы можете настроить с notFound маршрута notFound:

$app->notFound(function() { ... });  

Я считаю, что ваш 500 должен быть брошен на основе чего-то другого (вы можете проверить, правильно ли все ваши функции getPerson и все другие функции обрабатываются правильно... поскольку внутренняя ошибка сервера не должна указывать на проблему с запросом)... однако вы можете настроить любую ошибку, используя общий путь ошибки:

$app->error(function(\Exception $e) { ... });

Затем вы можете отображать сообщения об ошибках на основе кода ошибки.


Подробнее об этом здесь. Тонкая обработка ошибок

  • 0
    Спасибо за Ваш ответ! По какой-то причине теперь я получаю метод 405, который не разрешен , больше нет 500 (возможно, раньше я тестировал междоменный домен из приложения Angular, обслуживаемого grunt на порту 9000 ....). К сожалению, ни $ app-> notFound (), ни $ app-> error () не зарегистрированы ... (см. Мое обновление).
-1

Você pode facilmente resolver isso adicionando um Midlleware para fazer esse controle:

Класс

<?php

namespace App\Middleware;

use Psr\Http\Message\ServerRequestInterface as Request;
use Psr\Http\Message\ResponseInterface as Response;


class RouterMiddleware
{

    //Add your constructor class if necessary

    public function __invoke($request, $response, $next)
    {
        $route = $request->getAttribute('route');
        if(!$route){
            throw new \Slim\Exception\NotFoundException($request, $response);
        }
        return $next($request, $response);
    }
}

зависимость

$container[App\Middleware\RouterMiddleware::class] = function ($c) {
    return new App\Middleware\RouterMiddleware($c);
};

Регистрация Midleware для всех маршрутов

$app->add(\App\Middleware\RouterMiddleware::class);
  • 0
    Пожалуйста, пиши по-английски. Спасибо.
  • 0
    Согласно политике SO, все ответы должны быть на английском языке.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню