使用die()创建的请求也会使请求调用者死亡

时间:2016-02-11 15:03:49

标签: php laravel

我不知道这是否适合雇用......

我制作了一个API,其中的答案由die()函数发送,以避免一些更无用的计算和/或函数调用。

示例:

if (isset($authorize->refusalReason)) {
    die ($this->api_return(true, [
        'resultCode' => $authorize->resultCode,
        'reason' => $authorize->refusalReason
        ]
    ));
}

// api_return方法:

protected function api_return($error, $params = []) {
    $time = (new DateTime())->format('Y-m-d H:i:s');
    $params = (array) $params;
    $params = ['error' => $error, 'date_time' => $time] + $params;
    return (Response::json($params)->sendHeaders()->getContent());
}

但是我的网站基于这个API,因此我创建了一个函数来创建Request并根据其URI,方法,参数和标题返回它的内容:

protected function get_route_contents($uri, $type, $params = [], $headers = []) {
    $request = Request::create($uri, $type, $params);
    if (Auth::user()->check()) {
        $request->headers->set('S-token', Auth::user()->get()->Key);
    }
    foreach ($headers as $key => $header) {
        $request->headers->set($key, $header);
    }
    // things to merge the Inputs into the new request.
    $originalInput = Request::input();
    Request::replace($request->input());
    $response = Route::dispatch($request);
    Request::replace($originalInput);
    $response = json_decode($response->getContent());
    // This header cancels the one there is in api_return. sendHeaders() makes Content-Type: application/json
    header('Content-Type: text/html');
    return $response;
}

但是现在当我尝试调用API函数时,API中的请求会死掉,但也会死于我当前的请求。

public function postCard($token) {
    $auth = $this->get_route_contents("/api/v2/booking/payment/card/authorize/$token", 'POST', Input::all());
    // the code below is not executed since the API request uses die()
    if ($auth->error === false) {
        return Redirect::route('appts')->with(['success' => trans('messages.booked_ok')]);
    }
    return Redirect::back()->with(['error' => $auth->reason]);
}

你知道我能否比这更好地处理它?有关如何将我的代码转换成任何建议吗?

我知道我可以使用退货,但我总是想知道是否还有其他解决方案。我的意思是,我希望自己变得更好,所以如果我确切知道做我想做的事情的唯一方法是使用回报,我就不会问这个问题。

1 个答案:

答案 0 :(得分:0)

因此,您似乎通过代码调用API端点,就像它来自浏览器(客户端)一样,我假设您的Route:dispatch没有发出任何外部请求(如curl等)

现在有各种方法可以解决这个问题:

  1. 如果函数get_route_contents将处理所有请求,那么您需要从端点中删除骰子并简单地让它们返回数据(而不是回显)。你的这个"处理程序"将负责回应。

  2. 使您的Endpoint函数具有一个可选参数(或$ request变量中设置的某个属性),这将告诉函数这是一个内部请求,并且当请求直接来自时,应该返回数据您可以执行echo

  3. 的浏览器(客户端)
  4. 使用curl等对您的代码进行外部调用(如果没有其他选项,则只执行此操作)