用于 API 和非 API 的 Laravel 资源控制器

Posted

技术标签:

【中文标题】用于 API 和非 API 的 Laravel 资源控制器【英文标题】:Laravel resource controllers for both API and non-API use 【发布时间】:2013-07-27 15:48:38 【问题描述】:

在为同样对 API 进行 AJAX 调用的网站创建资源控制器 PhotosController 后,资源控制器似乎既可用于普通网站,也可用作 API。

这将为Photo 显示一个 id = 1 的 html 页面

http://domain.com/photos/1

javascript 使用以下内容更新 Photo 资源并返回 JSON 响应

PUT http://domain.com/api/v1/photos/1

问题:我们是否有 2 个PhotoControllers,一个用于处理 API 使用,一个用于非 API?

【问题讨论】:

【参考方案1】:

没有。您可以让两个单独的路由指向同一个控制器和操作。

Route::get('/photos/1', 'PhotoController@index');
Route::get('/api/v1/photos/1', 'PhotoController@index');

然后,在您的控制器方法中,您可以测试请求是否来自 Ajax。

if (Request::ajax()) 
    // Do some crazy Ajax thing

【讨论】:

为什么要包含域?对我来说,这是一个 DRY 问题,而且有点不必要...... 你不会想要的。我改变了编辑我的答案。感谢您指出这一点,@Mike Anthony【参考方案2】:

我使用带前缀的路由组进行 API 调用:

Route::resource('venue', 'VenueController');

Route::group(array('prefix' => 'api'), function()
    Route::resource('venue', 'VenueController', array('only' => array('index', 'show')));
);

然后,在控制器中,我使用这个条件:

if (Route::getCurrentRoute()->getPrefix() == 'api') 
    return Response::json($venues->toArray());

【讨论】:

以上是关于用于 API 和非 API 的 Laravel 资源控制器的主要内容,如果未能解决你的问题,请参考以下文章

用于 api 的 Laravel/Lumen 电子邮件修剪

用于 API 响应的 Laravel 自定义包装器

如何将 Laravel 护照用于 Auth 和 Lumen 作为 api

Laravel 5.3 中以 API 为中心的应用程序

用于非 SPA 的 Laravel Sanctum API 令牌

Laravel 5.6 - Passport JWT httponly cookie SPA 身份验证用于自用 API?