Slim PHP:在所有路由之前运行例程

时间:2014-05-21 18:31:59

标签: php rest slim

有没有办法在Slim PHP中的每个路由之前调用例程?我有一个RESTful API,我想在调用API方法之前验证登录。我的代码如下:

$app = new Slim();
$app->get('user/:id', function($id) use($app){
    $user = API::getUser($id);
    if($user){
        $app->response->status(200);
    }else{
        $app->response->status(404);
    }
});

API发出请求并处理JSON响应。我想附加一个允许请求的前提条件,比如回调。 API有一个返回API::validate($token)true的方法false,如果身份验证失败,我想抓住这个并返回状态代码401。某些方法(如API::login()API::register())不需要此验证。

1 个答案:

答案 0 :(得分:3)

首先,我强烈建议您阅读所有文档。它不是那么大,你会得到一个很好的框架介绍。 http://docs.slimframework.com/

你不需要一个例程,但需要在每个例程之前调用一个钩子。这就是苗条的结构。

一个简单的解决方案是将非受保护的页面保留在一个数组中,并在该钩子中检查请求是否受到保护。

$app->hook('slim.before.dispatch', function() use ($app) { 
   $publicRoutes = array('login', 'welcome');

   if(!in_array($app->router()->getCurrentRoute(), $publicRoutes) 
       // Get the token 
       $result = API::validate($token);
       if(!$result) {
       $app->redirect('/login');
    }
});

如果您想使用权限级别,oauths等处理更复杂的流程,您宁可使用中间件。我喜欢它们,因为它是使用Slim执行此类任务的正确方法,您可以重复使用它们。