Laravel和具有多个“嵌套”任务和参数的路由

时间:2014-02-14 14:35:14

标签: php rest laravel-4 routing

我刚刚开始修改Laravel(PHP新手警报),我对如何在此框架上实现我的REST JSON API表示怀疑。

所需的网址路径应为:

http://api.mysite.com/APIKEY/FUNCTION/(ARGUMENTS)*

但最好的方法是什么?

我没有找到足够的解释性指南,因为假设每个功能(身份验证,搜索等)都在不同的路径上。

目前我设法为所需数据创建迁移和模型,我也设置了这样的路线:

Route::get('/{apikey}/{function}/{arg1}/{arg2}/{arg3?}', 
//The first two arguments are mandatory, the 3rd optional
function($apikey,$function,$arg1,$arg2)
{
        return Response::json(array(
        'status'=>'200'),
        200);
})
->where(array('function'=>'[A-Za-z]+')); 

这应该是正确的行动流程,但我有些疑惑。

  1. 检查apikey是否有效,如果没有返回404 json响应。如何调用此函数,我在哪里定义它?
  2. 如果密钥检查成功,请了解需要哪个功能(我应该使用交换机构造还是有更好的方法来实现此功能,如路由组?在Route::group的所有示例中都有一个静态前缀,但这里的前缀是apikey,一个变量)
  3. 返回数据 - 如果可用 - 从数据库中获取数据。我想对于每个函数,我应该编写一个特定的控制器,使用Models从数据库中获取数据。

1 个答案:

答案 0 :(得分:1)

@ 1。我想我可能会使用路由过滤器,如下所示:

Route::filter('apikey', function(){
    if (Shared\API::checkIfKeyIsValid(Input::get('key') != true){
        return Shared\Errors::handleError("bad-api-key");
    }
});

您可以看到此过滤器检查以确保某些会话变量已设置和匹配,如果它返回ANYTHING,则表示失败,并且它不会发送路径正常运行的用户。你可以在这样的路线中称呼它:

Route::get('play/{id}', array('before' => 'loggedin', 'uses' => 'ThingController@doThing'));

@ 2。我认为一个路线组是我如何构建这个(如果我理解你在问什么) 编辑:自从我回答以来,你已经改变了问题,前缀是变量。我会重新排序您的参数,以便API密钥在最后,或者您可以看一下,这可能会做您想要的:https://github.com/jasonlewis/enhanced-router

Route::group(array('prefix' => 'api'), function()
{
    //the routes for all API calls
    Route::group(array('prefix' => '/v1'), function()
    {
        //for version 1
        Route::group(array('prefix' => '/thing', 'before' => 'loggedin'), function()
        {
            //for things only
            Route::get('/getThing/{id}', 'APIController@getThing');
            Route::get('/getDifferentThing/{id}/{aux}/{optional?}', 'APIController@getDifferentThing');
        });
    });
});

@ 3。数据的返回应该通过控制器完成,数据来自模型。要么将其作为视图返回,要么将其作为JSON返回,如下所示:

return Response::json($data);