예제 #1
0
파일: Response.php 프로젝트: romeoz/rock
 /**
  * Redirects the browser to the specified URL.
  *
  * This method adds a "Location" header to the current response. Note that it does not send out
  * the header until {@see \rock\response\Response::send()} is called. In a controller action you may use this method as follows:
  *
  * ```php
  * return Rock::$app->response->redirect($url);
  * ```
  *
  * In other places, if you want to send out the "Location" header immediately, you should use
  * the following code:
  *
  * ```php
  * Rock::$app->response->redirect($url)->send();
  * return;
  * ```
  *
  * In AJAX mode, this normally will not work as expected unless there are some
  * client-side JavaScript code handling the redirection. To help achieve this goal,
  * this method will send out a "X-Redirect" header instead of "Location".
  *
  * If you use the "rock" JavaScript module, it will handle the AJAX redirection as
  * described above. Otherwise, you should write the following JavaScript code to
  * handle the redirection:
  *
  * ```js
  * $httpProvider.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest'
  * ```
  *
  * @param string $url the URL to be redirected to. This can be in one of the following formats:
  *
  * - a string representing a URL (e.g. "http://example.com")
  * - a string representing a URL alias (e.g. "@example.com")
  *
  * Any relative URL will be converted into an absolute one by prepending it with the host info
  * of the current request.
  *
  * @param integer $statusCode the HTTP status code. Defaults to 302.
  * See @link http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
  * for details about HTTP status code
  * @param boolean $checkAjax whether to specially handle AJAX (and PJAX) requests. Defaults to true,
  * meaning if the current request is an AJAX or PJAX request, then calling this method will cause the browser
  * to redirect to the given URL. If this is false, a `Location` header will be sent, which when received as
  * an AJAX/PJAX response, may NOT cause browser redirection.
  * @return static the response object itself
  */
 public function redirect($url, $statusCode = 302, $checkAjax = true)
 {
     if (strpos($url, '/') === 0 && strpos($url, '//') !== 0) {
         $url = $this->request->getHostInfo() . $url;
     }
     if ($checkAjax) {
         if ($this->request->isPjax()) {
             $this->getHeaders()->set('X-Pjax-Url', $url);
         } elseif ($this->request->isAjax()) {
             $this->getHeaders()->set('X-Redirect', $url);
         } else {
             $this->getHeaders()->set('Location', $url);
         }
     } else {
         $this->getHeaders()->set('Location', $url);
     }
     $this->setStatusCode($statusCode);
     return $this;
 }