苗条:如何捕捉无效路线?

时间:2015-01-31 18:14:50

标签: php http slim

我已使用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服务,但我也需要它来跨域工作......

2 个答案:

答案 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);
};

为所有路线注册Midleware

$app->add(\App\Middleware\RouterMiddleware::class);