我已使用Slim
设置了一个简单的RESTful服务
这是我的路由的摘录:
...
$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();
如果我通过 405 Method Not Allowed HTTP状态代码得到无法预料的请求Slim
答案。
如何捕获不可预见的请求,自定义答案?
更新
正如@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->错误()似乎已注册...我错误的路线一直出现 405 错误。 。:-(
例如,调用 http://localhost/myapp/api/persons/NOT_EXISTING_ROUTE
注意:我目前正在测试来自同一域的Slim服务,但我也需要它来跨域工作......
答案 0 :(得分:6)
通常情况下,如果没有路由符合请求,则会抛出 404 Not Found ...您可以使用notFound
路由进行自定义:
$app->notFound(function() { ... });
我相信你的500必须基于别的东西抛出(你可能想检查你的getPerson
和所有其他函数是否正确处理所有事情......因为内部服务器错误不应该表明请求问题)...但是,您可以使用通用错误路由自定义任何错误:
$app->error(function(\Exception $e) { ... });
然后,您可以根据错误代码呈现自定义错误响应消息。
在此处详细了解Slim Error Handling
答案 1 :(得分:-2)
Vocêpodefacilmente 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);