Я установил простой сервис 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-сервис из того же домена, но мне тоже нужно работать в междоменном режиме...
Обычно, если маршрут не совпадает с запросом, вызывается 404 Not Found... который вы можете настроить с notFound
маршрута notFound
:
$app->notFound(function() { ... });
Я считаю, что ваш 500 должен быть брошен на основе чего-то другого (вы можете проверить, правильно ли все ваши функции getPerson
и все другие функции обрабатываются правильно... поскольку внутренняя ошибка сервера не должна указывать на проблему с запросом)... однако вы можете настроить любую ошибку, используя общий путь ошибки:
$app->error(function(\Exception $e) { ... });
Затем вы можете отображать сообщения об ошибках на основе кода ошибки.
Подробнее об этом здесь. Тонкая обработка ошибок
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);
};
$app->add(\App\Middleware\RouterMiddleware::class);