我已经制作了一个在Laravel中返回json的API. (路径/ api.php)
现在我想在我的项目Web侧面使用所述API(routes / web.php(包括中间件),刀片视图等).
我目前的解决方案是这样的:
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.但我觉得这不是最好的练习或聪明.除登录和注册之外的其他路由使用存储在会话中的api令牌来进行调用.他们将令牌“x-token”作为标题附加到$internal_request.在中间件中执行此操作更好吗?在某处有一些最好的实现示例吗?
我的API有这样的方法:
POST api / register
检查是否存在必填字段并具有严格格式(验证)
我的网络路线已经/注册
这将首先检查密码是否与密码验证输入匹配(pass1 == pass2),然后将其传递给api等效项.
所以web应该是api的超集(验证明智).
最佳答案 据我所知,您希望对api和Web请求应用相同的逻辑,您可能只想(a)验证Web请求的表单和/或(b)将响应包装在json中以获取API请求.
我认为最好的方法是为web和api请求引用相同的控制器和方法,例如:
在您的routes / web.php中,添加Route :: post(‘/ register’,’RegistrationController @ register);`
在你的routes / 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);
}
}