我已经制作了一个在Laravel中返回json的API。 (的路由/ api.php )
现在我想在项目的web
侧( routes / web.php (包括中间件),刀片视图等)中使用所述API )。
我现有的解决方案是这样的:
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
检查所需字段是否存在并具有严格格式(验证)
我的网络路线有/register
这将首先检查密码是否与密码验证输入匹配(pass1 == pass2),然后将其传递给api等效项。
所以web
应该是api
的超集(验证明智)。
答案 0 :(得分:1)
据我了解你的问题,你想对api和web请求应用相同的逻辑,你可能只想(a)验证Web请求的表单和/或(b)将响应包装在json中API请求。
我认为最好的方法是引用web和api请求的相同控制器和方法,例如:
在您的routes / web.php中,添加Route::post('/register', 'RegistrationController@register
);`
在你的路线/ api.php中,添加Route::post('/register', 'RegistrationController@register
)`
因此最终两个请求(api / register和/ register)都命中了同一个控制器 和方法。
现在,在您的控制器中,您可以根据请求执行额外操作,如下所示:
public function register(Request $request) {
if(!$request->expectsJson()) { // you may want to swap this with $request->isJson() depending on the HTTP headers for your app
$this->validateWebRegistration($request); // your validation logic specific to web requests here
}
// common logic here (including validation); store result as $result
if($request->expectsJson()) { // based on HTTP headers as above
return response()->json($result);
} else {
return view('register', $result);
}
}
答案 1 :(得分:1)
我想我会这样做: