在使用我自己的Laravel API时,如何遵循“不要重复自己”原则?

2022-08-30 09:29:13

我正在开发一个Laravel 4应用程序,它将通过JSON REST API和Web UI在我的数据集上提供相同的CRUD操作。似乎为了防止打破DRY原则,我的UI应该通过将UI中的所有请求路由回API来使用我自己的API。我不确定完成这项工作的最佳方法。据推测,我将拥有单独的UI和API控制器,并以某种方式路由请求。还是我应该考虑一种完全不同的方法?


答案 1

我实际上正在修改同样的想法,而且非常整洁。使用Laravel,您确实有能力提出内部请求(有些人可能会将其称为HMVC,但我不会)。下面是内部请求的基础知识。

$request = Request::create('/api/users/1', 'GET');

$response = Route::dispatch($request);

$response现在将包含 API 的返回响应。通常,这将返回一个JSON编码的字符串,这对客户端来说很好,但对于内部API请求来说不是那么好。您必须在此处扩展一些内容,但基本上,我们的想法是为内部调用返回实际对象,而对于外部请求,则返回格式化的 JSON 响应。你可以利用像这里这样的东西来做这种事情。$response->getOriginalContent()

您应该考虑做的是构建某种内部结构,允许您调度API请求并返回原始对象。调度程序还应处理格式错误的请求或错误的响应,并引发异常以进行匹配。Dispatcher

这个想法本身是坚实的。但是规划 API 是一项艰巨的工作。我建议你写一份包含所有预期端点的良好列表,并起草几个 API 版本,然后选择最好的一个。


答案 2

注意:正如 vcardillo 在下面指出的那样,不使用这些方法调用路由筛选器。

我目前正在做同样的事情,杰森的回答让我朝着一个伟大的方向前进。查看Symfony\Component\HttpFoundation\Request文档,我想出了如何开机自检,以及我需要做的其他所有事情。假设您使用的是表单,下面是一些可以帮助您的代码:

获取:

$request = Request::create('/api/users/1', 'GET');

$response = Route::dispatch($request);

发布:

$request = Request::create('/api/users/1', 'POST', Input::get());

$response = Route::dispatch($request);

带饼干的开机自检

$request = Request::create('/api/users/1', 'POST', Input::get(), Cookie::get('name'));

$response = Route::dispatch($request);

带文件的开机自检

$request = Request::create('/api/users/1', 'POST', Input::get(), null, Input::file('file'));

$response = Route::dispatch($request);

我希望这对其他人有所帮助。如果您没有使用表单,或者您没有使用Laravel的输入/ Cookie外观,请将输入/ Cookie外观替换为您自己的内容。


推荐