【问题标题】:Laravel and routes with multiple "nested" tasks and parametersLaravel 和具有多个“嵌套”任务和参数的路由
【发布时间】:2014-03-13 23:26:50
【问题描述】:

我刚刚开始修改 Laravel(PHP 新手警报),我对如何在这个框架上实现我的 REST JSON API 有疑问。

所需的 URL 路径应该是:

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 从数据库中获取数据。

【问题讨论】:

    标签: php rest laravel-4 routing


    【解决方案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);
    

    【讨论】:

    • 1- 您如何处理身份验证?调用返回 true 或 false 的 Controller 函数?根本不清楚。对于身份验证,我只想发送 api 密钥并对其进行一些检查。在创建身份验证过滤器之前,我应该定义身份验证(密钥检查)功能,但我不知道如何:) 2- 好的 3- 好的
    • @Vektor88 我已经更新了#1,希望能更好地解释它。我在共享文件夹中构建了我的类,然后这个示例假设我有一个名为“API”的类。我正在调用一个名为“checkIfKeyIsValid”的函数,如果密钥有效则返回true,否则返回false。过滤器检查该函数返回的内容,如果它不返回true,它会抛出一个(自定义)错误,并且由于它显示return,过滤器失败,并且路由处理停止。
    • 感谢您的编辑,我开始了解我应该做什么以及面向对象的 PHP 是如何工作的。但是第2点从一开始就需要变量前缀,我什么都没改!
    猜你喜欢
    • 2014-06-30
    • 2016-12-29
    • 1970-01-01
    • 2016-10-12
    • 2021-03-02
    • 2014-05-04
    • 2018-03-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多