您可以使用您的API并在Laravel中吃(消耗)它吗?

时间:2017-02-15 13:08:19

标签: laravel api laravel-5

我已经制作了一个在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。但我觉得这不是最好的练习或聪明。除loginregister之外的其他路由使用会话中存储的api令牌进行调用。他们附加了令牌" x-token"作为$internal_request的标题。在中间件中执行此操作更好吗?在某个地方是否有一些最佳实施的例子?

我的API有这样的方法:

POST api/register 检查所需字段是否存在并具有严格格式(验证)

我的网络路线有/register

这将首先检查密码是否与密码验证输入匹配(pass1 == pass2),然后将其传递给api等效项。

所以web应该是api的超集(验证明智)。

2 个答案:

答案 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)

我想我会这样做:

  • 在控制器中检测我们是否处理API请求或Web请求
  • 检测有害的凭证(令牌或会话)
  • 如果网络
  • ,则形成逻辑
  • 在两种情况下都做api逻辑
  • 相应地创建视图或json响应
  • 全部在同一个控制器中