Laravel资源控制器 - 将API调用与浏览器区分开来

时间:2016-01-13 21:30:58

标签: php api laravel laravel-5 laravel-5.2

我有一条像这样定义的路线:

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

POST/problem的那一刻,会触发ProblemController@store方法。

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

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

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

我正在使用Laravel 5.2。

谢谢!

2 个答案:

答案 0 :(得分:6)

请求对象提供了一种方法 wantsJson(),用于检查请求的接受标头,如果 JSON TRUE >被要求了。

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

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

return view('foo.bar');

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

答案 1 :(得分:1)

您可以创建如下路线组:

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

这对我来说最有意义,因为返回视图和API路由的路由是两个不同的东西。你应该有一个控制器用于你想要在你的应用程序中显示的页面和视图,另一个用于更新和更改数据的api路由,返回JSON。