如何为Web客户端和本地移动应用程序设计Laravel 5.1应用程序

9

我希望创建一个适用于Web和移动应用API的Laravel 5.1应用程序。对于API请求,我想返回JSON,而对于Web浏览器,则是视图。目前,我已经设置了不同的路由和控制器。在这种方法中,我重复了代码。我不知道设计这种架构的最佳方法是什么。此外,我已经阅读了一些类似的主题,建议使用angular.js来处理Web浏览器。

// web controller
Route::resource('product', 'ProductController');

// api controller 
Route::group(['prefix' => 'api'], function() {
    Route::resource('product', 'APIProductController');
});

我不知道这是否适用于Laravel,但我们可以在Ruby on Rails中为给定目的创建组/命名空间。请查看此链接:http://laravel-tricks.com/tricks/route-group-namespacing - Arihant Godha
2个回答

2
您可以有两种基本方法:
  • 保持单独的路由和控制器,但将所有共同控制器的代码移动到服务中。这可能是最清洁和最灵活的解决方案,因为它使得未来很容易独立更新API和Web方法。
  • 或者您可以将api和web请求路由到同一个控制器,将Request对象传递给它,然后根据一些请求属性决定返回哪个响应(json或html)。
例如,对于第二种方法,您可以按如下方式处理:
// web controller
Route::resource('product', 'ProductController');

// api controller 
Route::group(['prefix' => 'api'], function() {
    Route::resource('product', 'ProductController');
});

// and in the ProductController you have
public function index(Request $request) 
{
    // do some stuff...

    if ($request->segment(1) === 'api') { // route prefix was api
        // return json
    } else {
        // return the view
    }
}

您可以使用 $request->wantsJson() 方法来检查 Accept: header,或者您可以在所有 API 调用中传递一个特殊的 GET 变量(例如 ?_format=json)来定义响应格式应为 json,如 @Bogdan Kuštan 已经建议过的那样。在我看来,如果您已经在您的 URL 上使用 API 前缀,只需检查即可更可靠和更干净。

谢谢 @ivanhoe。我正在使用仓储设计模式,将我常用的逻辑移到那里。在控制器中,使用接口类型提示并访问通用方法。 - Ashish

1
一种方法是使用内容协商方法。您将传递头部Accept: application/json,然后您的应用程序将返回json格式的响应。但是,有些代理服务器不尊重内容协商,那么您的应用程序将会中断(您可以在此处阅读更多关于Drupal放弃内容协商的原因)。
另一个可能性是使用一些GET变量来返回所请求的格式,例如:/api/product?format=json 此外,您可以从/api调用中传递变量:
Route::get('/api/product', ['as' => 'product', function(){
    return App::make('ProductController')->index('json');
}]);

public function index($format) {
    // Your controller code

    if ($format == 'json') {
        // return JSON
    }

    // return HTML
}

或者您可以直接解析URI并查看它是否以/API开头(不建议)。我的选择是内容协商和/或format GET变量。


好的,我可以用那种方式来破解它,但我想通过专注于设计更好的架构来尽可能地优雅地完成它。 - Ashish
试试 Dingo/API,它很棒并支持版本控制和大多数身份验证方法。 - astroanu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接