在Restful controller

时间:2017-09-23 19:24:21

标签: laravel rest request

我的路线/ web.php中有这样的路线

Route::resource('/api/surveys', 'SurveyController');

正如文档所述,它为API创建了所有需要的路径。这是一个函数,当我去/ api / survey路径时执行:

public function index()
{

    $request = request();

    if(!$request->hasHeader('token')) {

        return "No auth token found.";
    }

    $tokenCheck = $this->userService->isTokenValid($request->header('token'));

    if($tokenCheck !== true) {

        return $tokenCheck;

    }

    return $this->surveyService->all();
}

它做什么,它检查是否设置了令牌头参数,如果没有,则返回错误,如果是,则检查令牌是否有效等等,如果一切正常,则应从数据库返回调查。

public function surveys() {

    $request = \Request::create('/api/surveys', 'GET');
    $request->headers->set('Accept', 'application/json');
    $request->headers->set('token', \Cookie::get('token'));
    $response = \Route::dispatch($request);

    print_r('<pre>');
    print_r($response);
    print_r('</pre>');

}

我有一个网站,应该使用我刚创建的API来获取所有调查记录。我创建了一个新的请求对象,设置标题&#34;标记&#34;使用令牌我从cookie中获取,然后尝试发送并获得响应。但问题是每次我得到&#34;没有找到身份验证令牌。&#34;错误。这意味着$ request-&gt; hasHeader(&#39; token&#39;)返回false,即使我在请求中设置它也很难。如果我在Restful控制器中print_r $ request-&gt; all(),我得到一个空数组。

我试过Postman使用令牌参数来访问这个API,它在邮递员中工作正常,但是在这里,似乎请求在传递给API控制器时消失。

我在这里做错了什么?

1 个答案:

答案 0 :(得分:0)

当您手动创建请求并将其分派时,它可以使路由调用正确的控制器,但这不会影响容器中绑定的请求。

当你的&#34;假的&#34;请求由api控制器处理,它从容器中取出的请求是原始&#34;真正的&#34;请求由用户提出。

您需要app()->handle($request)新请求,而不是使用新请求调度路线。然而,这将完全取代原来的&#34;真实的&#34;要求你的新&#34;假&#34;请求,因此原始请求中的所有内容都将丢失。

说了这么多,即使是泰勒也不鼓励使用这种消费自己的api的方法。您可以阅读他对this Github issue的评论。所以,像这样消费你自己的api可能有用,但你也可能遇到其他一些不可预见的问题。

更合适的解决方案是将api路由调用的逻辑提取到另一个类,然后从api路由和Web路由调用该提取的逻辑。