摘要:響應準備若不是的對象,則構造成此對象類型本質就是用的類構建響應準備主要是設置響應頭信息類設置編碼格式若傳輸時用分塊編碼,則移除因為采用分塊編碼時可以知道傳輸何時完成
Laravel 響應準備
public function prepareResponse($request, $response) { if ($response instanceof PsrResponseInterface) { $response = (new HttpFoundationFactory)->createResponse($response); } // 若不是 SymfonyComponentHttpFoundationSymfonyResponse 的對象,則構造成此對象 elseif (! $response instanceof SymfonyResponse) { $response = new Response($response); } return $response->prepare($request); }PsrResponseInterface 類型
public function createResponse(ResponseInterface $psrResponse) { $response = new Response( $psrResponse->getBody()->__toString(), $psrResponse->getStatusCode(), $psrResponse->getHeaders() ); $response->setProtocolVersion($psrResponse->getProtocolVersion()); foreach ($psrResponse->getHeader("Set-Cookie") as $cookie) { $response->headers->setCookie($this->createCookie($cookie)); } return $response; } 本質就是用的 Response 類Response 構建
public function __construct($content = "", $status = 200, $headers = array()) { $this->headers = new ResponseHeaderBag($headers); $this->setContent($content); $this->setStatusCode($status); $this->setProtocolVersion("1.0"); // Deprecations $class = get_class($this); if ($this instanceof PHPUnit_Framework_MockObject_MockObject || $this instanceof ProphecyDoublerDoubleInterface) { $class = get_parent_class($class); } if (isset(self::$deprecationsTriggered[$class])) { return; } self::$deprecationsTriggered[$class] = true; foreach (self::$deprecatedMethods as $method) { $r = new ReflectionMethod($class, $method); if (__CLASS__ !== $r->getDeclaringClass()->getName()) { @trigger_error(sprintf("Extending %s::%s() in %s is deprecated since version 3.2 and won"t be supported anymore in 4.0 as it will be final.", __CLASS__, $method, $class), E_USER_DEPRECATED); } } } public function setContent($content) { if (null !== $content && !is_string($content) && !is_numeric($content) && !is_callable(array($content, "__toString"))) { throw new UnexpectedValueException(sprintf("The Response content must be a string or object implementing __toString(), "%s" given.", gettype($content))); } $this->content = (string) $content; return $this; } public function setStatusCode($code, $text = null) { $this->statusCode = $code = (int) $code; if ($this->isInvalid()) { throw new InvalidArgumentException(sprintf("The HTTP status code "%s" is not valid.", $code)); } if (null === $text) { $this->statusText = isset(self::$statusTexts[$code]) ? self::$statusTexts[$code] : "unknown status"; return $this; } if (false === $text) { $this->statusText = ""; return $this; } $this->statusText = $text; return $this; } public function isInvalid() { return $this->statusCode < 100 || $this->statusCode >= 600; } public function setProtocolVersion($version) { $this->version = $version; return $this; }響應準備
主要是設置響應頭
public function prepare(Request $request) { $headers = $this->headers; // 信息類 if ($this->isInformational() || $this->isEmpty()) { $this->setContent(null); $headers->remove("Content-Type"); $headers->remove("Content-Length"); } else { if (!$headers->has("Content-Type")) { $format = $request->getRequestFormat(); # static::$formats = array( # "html" => array("text/html", "application/xhtml+xml"), # "txt" => array("text/plain"), # "js" => array("application/javascript", "application/x-javascript", "text/javascript"), # "css" => array("text/css"), # "json" => array("application/json", "application/x-json"), # "xml" => array("text/xml", "application/xml", "application/x-xml"), # "rdf" => array("application/rdf+xml"), # "atom" => array("application/atom+xml"), # "rss" => array("application/rss+xml"), # "form" => array("application/x-www-form-urlencoded"), # ); if (null !== $format && $mimeType = $request->getMimeType($format)) { $headers->set("Content-Type", $mimeType); } } // 設置編碼格式 $charset = $this->charset ?: "UTF-8"; if (!$headers->has("Content-Type")) { $headers->set("Content-Type", "text/html; charset=".$charset); } elseif (0 === stripos($headers->get("Content-Type"), "text/") && false === stripos($headers->get("Content-Type"), "charset")) { $headers->set("Content-Type", $headers->get("Content-Type")."; charset=".$charset); } // 若傳輸時用分塊編碼,則移除 Content-Length, 因為采用分塊編碼時可以知道傳輸何時完成 if ($headers->has("Transfer-Encoding")) { $headers->remove("Content-Length"); } if ($request->isMethod("HEAD")) { $length = $headers->get("Content-Length"); $this->setContent(null); if ($length) { $headers->set("Content-Length", $length); } } } if ("HTTP/1.0" != $request->server->get("SERVER_PROTOCOL")) { $this->setProtocolVersion("1.1"); } if ("1.0" == $this->getProtocolVersion() && false !== strpos($this->headers->get("Cache-Control"), "no-cache")) { $this->headers->set("pragma", "no-cache"); $this->headers->set("expires", -1); } $this->ensureIEOverSSLCompatibility($request); return $this; } public function isInformational() { return $this->statusCode >= 100 && $this->statusCode < 200; } protected function ensureIEOverSSLCompatibility(Request $request) { if (false !== stripos($this->headers->get("Content-Disposition"), "attachment") && preg_match("/MSIE (.*?);/i", $request->server->get("HTTP_USER_AGENT"), $match) == 1 && true === $request->isSecure()) { if ((int) preg_replace("/(MSIE )(.*?);/", "$2", $match[0]) < 9) { $this->headers->remove("Cache-Control"); } } }
文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/22614.html
摘要:請求處理階段請求處理階段首先是準備請求處理的環(huán)境,包括環(huán)境加載服務提供者注冊等環(huán)節(jié),然后將請求實例通過中間件處理及通過路由和控制器的分發(fā)控制,使得不同的請求通過相應的處理程序進行處理并生成響應的過程。 Laravel請求到響應的整個執(zhí)行過程,主要可以歸納為四個階段,即程序啟動準備階段、請求實例化階段、請求處理階段、響應發(fā)送和程序終止階段。 程序啟動準備階段 服務容器實例化 服務容器的實...
摘要:請求周期加載自動加載器獲取應用對象實例化應用解析此對象貫穿全文主要過程設置基礎路徑基礎綁定注冊全局基礎服務核心容器別名設置注冊三個單例獲取對象實例化此對象為應用的樞紐,將會協(xié)調各部分之間的工作,完成請求主要過程注入應用對象注入事件對象注入 Laravel 請求周期 加載 composer 自動加載器 require __DIR__./../bootstrap/autoload.php;...
摘要:年月日階段劃分請求到響應的整個執(zhí)行階段歸納為個程序啟動準備階段文件自動加載服務容器實例化基礎服務提供者的注冊核心類的實例化請求實例化階段實例化實例請求處理階段準備請求處理的環(huán)境將請求實例通過中間件處理及通過路由和控制器的分發(fā)控制響應發(fā)送和 Last-Modified: 2019年5月10日16:19:07 階段劃分 Laravel 5.5請求到響應的整個執(zhí)行階段歸納為 4 個: ...
摘要:跨域的請求出于安全性的原因,瀏覽器會限制中的跨域請求。跨源共享標準需要瀏覽器和服務端共同配合才能完成,目前瀏覽器廠商已經(jīng)可以將請求部分自動完成,所以跨源資源訪問的重點還是在于服務器端。指明預請求或者跨域請求的來源。 跨域的請求 出于安全性的原因,瀏覽器會限制 Script 中的跨域請求。由于 XMLHttpRequest 遵循同源策略,所有使用 XMLHttpRequest 構造 HT...
摘要:可以通過來直接設置路由前綴給添加前綴通過,還是通過就可以了匹配包含的匹配包含的好了,這兩個框架的路由基本比較和應用就這些了,還有一些比如控制器路由和如何自定義中間件等在后續(xù)再寫吧,或者請自行查閱文檔,以上內容如有錯誤請指出。 Laravel是我最喜歡的PHP Web開發(fā)框架,所以也希望可以在Go的Web框架中選擇一個類似Laravel這樣的好用又全棧的框架,刷了一下Beego, Ech...
閱讀 2873·2023-04-26 02:49
閱讀 3451·2021-11-25 09:43
閱讀 3413·2021-10-09 09:43
閱讀 3001·2021-09-28 09:44
閱讀 2452·2021-09-22 15:29
閱讀 4522·2021-09-14 18:02
閱讀 2783·2021-09-03 10:48
閱讀 3430·2019-08-30 12:47