Laravel 足智多谋的控制器 - 区分来自浏览器的 API 调用

Laravel resourceful controller - differentiate an API call from a browser

我有一个这样定义的路由:

Route::resource('problem', 'ProblemController');

我从 POST/problem 的那一刻,触发了一个 ProblemController@store 方法。

现在我想要的是 return 一个 JSON 响应,如果它是一个 API 调用或一个视图(或者可能重定向),如果我在 "web-side" 我的申请。我该如何解决这个问题?

我应该创建单独的控制器吗?我是否应该(在每个 method/controller 中)检测请求的类型并做出相应的响应?我应该使用中间件吗?路由组?单独申请?

主要目标是在一个包中包含多种应用程序类型(API + 版本控制 + 网络),但共享业务逻辑、模型和大部分代码(以避免重复)。

我正在使用 Laravel 5.2。

谢谢!

您可以这样创建路由组:

Route::group(['prefix'=>'api'], function(){
    //All routes in this route become domain.com/api/route
});

这对我来说最有意义,因为 returns 视图的路线和 API 路线是两个独立的事物。您应该有一个控制器用于要在您的应用中显示的页面和视图,另一个控制器用于 api 更新和更改数据的路由,返回 JSON.

Request 对象提供了一个方法 wantsJson() 检查 Accept 请求头和 returns TRUE 如果 JSON 被请求。

在您的控制器中,您可以执行以下操作:

if( request()->wantsJson() )
{
    return ['foo' => 'bar'];
}

return view('foo.bar');

您可以在 Laravel 中阅读更多关于内容协商的信息:http://fideloper.com/laravel-content-negotiation