【发布时间】:2017-07-04 04:03:09
【问题描述】:
我在 Laravel 中创建了一个返回 json 的 API。 (routes/api.php)
现在我想在项目的web 端使用上述 API(routes/web.php(包括中间件)、blade 视图 等) .
我目前的解决方案是这样的:
public function register(Request $request) {
// password1 == password2 etc (form logic / validation)
$internal_request = Request::create($this->base_api_url . 'register', 'POST');
$internal_request->replace($request->input());
$response = Route::dispatch($internal_request);
}
如果表单有效,它将请求“转发”到我的 api 的 api 对应方。但我觉得这不是真正的最佳实践或聪明。除了login 和register 之外的其他路由使用存储在会话中的api 令牌进行调用。他们将令牌“x-token”作为标题附加到$internal_request。在中间件中这样做会更好吗?是否有一些最佳实施的例子?
我的 API 有这样一个方法:
POST api/register
检查所需字段是否存在并具有 rigt 格式(验证)
我的网络路由有/register
这将首先检查密码是否与密码验证输入 (pass1 == pass2) 匹配,然后将其传递给等效的 api。
所以web 应该是api 的超集(验证方式)。
【问题讨论】:
-
专注于单一职责,然后分解共同的工作。 Web、CLI 和 API 负责解组和验证输入。一旦对输入感到满意,他们就会将经过验证的输入交给执行所需任务的公共服务。最后,他们获取该公共服务的结果并将其编组回给用户。像这样的环回调用可以工作,但它们是多余的,因为编组/解组发生了两次。它还使测试变得比必要的更加困难,因为您最终依赖于集成测试并且经常一遍又一遍地测试相同的路径。
-
@bishop 是的,我正在考虑在模型中做更多的事情,而在控制器中做更少的事情。这样模型=单一责任。但是有一些硬定义的方法吗?
-
不,由于 TIMTOWTDI,没有硬定义的方式。我同意将大部分工作推入模型服务层是可行的方法。但是,我强调服务部分:大量模型类型的类处理数据转换整体问题的不同部分,而不是一些做太多事情的巨大模型。
-
我没有这样做的一个原因是,laravel 的验证默认使用
request对象的方式,直观感觉就像:“在控制器中这样做”。我的项目相对较小,只有 -
您的项目现在有 10 个模型。当心成功。