亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > PHP > 正文

Laravel核心解讀Response

2020-03-22 17:53:56
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了關于Laravel核心解讀Response,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下

Response

前面兩節我們分別講了Laravel的控制器和Request對象,在講Request對象的那一節我們看了Request對象是如何被創建出來的以及它支持的方法都定義在哪里,講控制器時我們詳細地描述了如何找到Request對應的控制器方法然后執行處理程序的,本節我們就來說剩下的那一部分,控制器方法的執行結果是如何被轉換成響應對象Response然后返回給客戶端的。

創建Response

讓我們回到Laravel執行路由處理程序返回響應的代碼塊:

namespace Illuminate/Routing;html' target='_blank'>class Router implements RegistrarContract, BindingRegistrar protected function runRoute(Request $request, Route $route) $request- setRouteResolver(function () use ($route) { return $route; $this- events- dispatch(new Events/RouteMatched($route, $request)); return $this- prepareResponse($request, $this- runRouteWithinStack($route, $request) protected function runRouteWithinStack(Route $route, Request $request) $shouldSkipMiddleware = $this- container- bound( middleware.disable )  $this- container- make( middleware.disable ) === true; //收集路由和控制器里應用的中間件 $middleware = $shouldSkipMiddleware ? [] : $this- gatherRouteMiddleware($route); return (new Pipeline($this- container)) - send($request) - through($middleware) - then(function ($request) use ($route) { return $this- prepareResponse( $request, $route- run()}

在講控制器的那一節里我們已經提到過runRouteWithinStack方法里是最終執行路由處理程序(控制器方法或者閉包處理程序)的地方,通過上面的代碼我們也可以看到執行的結果會傳遞給Router的prepareResponse方法,當程序流返回到runRoute里后又執行了一次prepareResponse方法得到了要返回給客戶端的Response對象, 下面我們就來詳細看一下prepareResponse方法。

class Router implements RegistrarContract, BindingRegistrar * 通過給定值創建Response對象 * @param /Symfony/Component/HttpFoundation/Request $request * @param mixed $response * @return /Illuminate/Http/Response|/Illuminate/Http/JsonResponse public function prepareResponse($request, $response) return static::toResponse($request, $response); public static function toResponse($request, $response) if ($response instanceof Responsable) { $response = $response- toResponse($request); if ($response instanceof PsrResponseInterface) { $response = (new HttpFoundationFactory)- createResponse($response); } elseif (! $response instanceof SymfonyResponse  ($response instanceof Arrayable || $response instanceof Jsonable || $response instanceof ArrayObject || $response instanceof JsonSerializable || is_array($response))) { $response = new JsonResponse($response); } elseif (! $response instanceof SymfonyResponse) { $response = new Response($response); if ($response- getStatusCode() === Response::HTTP_NOT_MODIFIED) { $response- setNotModified(); return $response- prepare($request);}

在上面的代碼中我們看到有三種Response:

Class NameRepresentationPsrResponseInterface(PsrHttpMessageResponseInterface的別名)Psr規范中對服務端響應的定義IlluminateHttpJsonResponse (SymfonyComponentHttpFoundationResponse的子類)Laravel中對服務端JSON響應的定義IlluminateHttpResponse (SymfonyComponentHttpFoundationResponse的子類)Laravel中對普通的非JSON響應的定義

通過prepareResponse中的邏輯可以看到,無論路由執行結果返回的是什么值最終都會被Laravel轉換為成一個Response對象,而這些對象都是SymfonyComponentHttpFoundationResponse類或者其子類的對象。從這里也就能看出來跟Request一樣Laravel的Response也是依賴Symfony框架的HttpFoundation組件來實現的。

我們來看一下SymfonyComponentHttpFoundationResponse的構造方法:

namespace Symfony/Component/HttpFoundation;class Response public function __construct($content = , $status = 200, $headers = array()) $this- headers = new ResponseHeaderBag($headers); $this- setContent($content); $this- setStatusCode($status); $this- setProtocolVersion( 1.0  //設置響應的Content 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;}

所以路由處理程序的返回值在創業Response對象時會設置到對象的content屬性里,該屬性的值就是返回給客戶端的響應的響應內容。

設置Response headers

生成Response對象后就要執行對象的prepare方法了,該方法定義在Symfony/Component/HttpFoundation/Resposne類中,其主要目的是對Response進行微調使其能夠遵從HTTP/1.1協議(RFC 2616)。

namespace Symfony/Component/HttpFoundation;class Response //在響應被發送給客戶端之前對其進行修訂使其能遵從HTTP/1.1協議 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 { // Content-type based on the Request if (!$headers- has( Content-Type )) { $format = $request- getRequestFormat(); if (null !== $format $mimeType = $request- getMimeType($format)) { $headers- set( Content-Type , $mimeType); // Fix Content-Type $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 )) { // add the charset $headers- set( Content-Type , $headers- get( Content-Type ). charset= .$charset); // Fix Content-Length if ($headers- has( Transfer-Encoding )) { $headers- remove( Content-Length  if ($request- isMethod( HEAD )) { // cf. RFC2616 14.13 $length = $headers- get( Content-Length  $this- setContent(null); if ($length) { $headers- set( Content-Length , $length); // Fix protocol if ( HTTP/1.0 != $request- server- get( SERVER_PROTOCOL )) { $this- setProtocolVersion( 1.1  // Check if we need to send extra expire info headers 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;}

prepare里針對各種情況設置了相應的response header 比如Content-Type、Content-Length等等這些我們常見的首部字段。

發送Response

創建并設置完Response后它會流經路由和框架中間件的后置操作,在中間件的后置操作里一般都是對Response進行進一步加工,最后程序流回到Http Kernel那里, Http Kernel會把Response發送給客戶端,我們來看一下這部分的代碼。

//入口文件public/index.php$kernel = $app- make(Illuminate/Contracts/Http/Kernel::class);$response = $kernel- handle( $request = Illuminate/Http/Request::capture()$response- send();$kernel- terminate($request, $response);
namespace Symfony/Component/HttpFoundation;class Response public function send() $this- sendHeaders(); $this- sendContent(); if (function_exists( fastcgi_finish_request )) { fastcgi_finish_request(); } elseif ( cli !== PHP_SAPI) { static::closeOutputBuffers(0, true); return $this; //發送headers到客戶端 public function sendHeaders() // headers have already been sent by the developer if (headers_sent()) { return $this; // headers foreach ($this- headers- allPreserveCaseWithoutCookies() as $name = $values) { foreach ($values as $value) { header($name. : .$value, false, $this- statusCode); // status header(sprintf( HTTP/%s %s %s , $this- version, $this- statusCode, $this- statusText), true, $this- statusCode); // cookies foreach ($this- headers- getCookies() as $cookie) { if ($cookie- isRaw()) { setrawcookie($cookie- getName(), $cookie- getValue(), $cookie- getExpiresTime(), $cookie- getPath(), $cookie- getDomain(), $cookie- isSecure(), $cookie- isHttpOnly()); } else { setcookie($cookie- getName(), $cookie- getValue(), $cookie- getExpiresTime(), $cookie- getPath(), $cookie- getDomain(), $cookie- isSecure(), $cookie- isHttpOnly()); return $this; //發送響應內容到客戶端 public function sendContent() echo $this- content; return $this;}

send的邏輯就非常好理解了,把之前設置好的那些headers設置到HTTP響應的首部字段里,Content會echo后被設置到HTTP響應的主體實體中。最后PHP會把完整的HTTP響應發送給客戶端。

send響應后Http Kernel會執行terminate方法調用terminate中間件里的terminate方法,最后執行應用的termiate方法來結束整個應用生命周期(從接收請求開始到返回響應結束)。

以上就是本文的全部內容,希望對大家的學習有所幫助,更多相關內容請關注PHP !

相關推薦:

Laravel核心解讀Request

Laravel核心解讀Facades

以上就是Laravel核心解讀Response的詳細內容,PHP教程

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲久久久久久久久久久| 97视频在线观看免费| 久久露脸国产精品| 久久视频在线免费观看| 中文字幕亚洲欧美| 91精品视频免费看| 国产日韩欧美成人| 国产成人极品视频| 亚洲最新在线视频| 日韩一区视频在线| 亚洲成人久久一区| 欧美成人亚洲成人| 精品福利一区二区| 欧美性感美女h网站在线观看免费| 亚洲国产精品视频在线观看| 亚洲欧美日韩精品久久| 欧美精品一区在线播放| 欧美丰满片xxx777| 国产成人91久久精品| 亚洲人午夜色婷婷| 国产在线不卡精品| 国产精品高潮呻吟久久av野狼| 中文字幕精品国产| 成人免费网站在线观看| 国产自产女人91一区在线观看| 国产精品免费在线免费| 久久香蕉精品香蕉| 高清欧美性猛交xxxx黑人猛交| 亚洲国产成人av在线| 国产色婷婷国产综合在线理论片a| 日韩av黄色在线观看| 欧美成人精品在线视频| 成人网中文字幕| 欧美在线一级va免费观看| 亚洲国产精品久久久久秋霞蜜臀| 日韩亚洲欧美中文高清在线| 成人国产精品久久久久久亚洲| 欧美黄色片在线观看| 日本久久久久久久久久久| 91在线无精精品一区二区| 国产精品av网站| 国产999精品久久久| 久久免费视频网| www国产精品视频| 午夜精品久久久久久99热软件| 668精品在线视频| 38少妇精品导航| 国产视频丨精品|在线观看| 成人淫片在线看| 久久精品91久久香蕉加勒比| 国产精品wwwwww| 国产精品看片资源| 国产精品久久久久久亚洲调教| 欧美黄网免费在线观看| 成人国产精品久久久久久亚洲| 国产精品毛片a∨一区二区三区|国| 国产精品女人网站| 国产成人精品久久亚洲高清不卡| 国产精品久久久久av免费| 国产成人福利网站| 亚洲国产精品大全| 欧美日韩国产成人高清视频| 成人伊人精品色xxxx视频| 亚洲欧美国内爽妇网| 亚洲美女中文字幕| 国产精品69久久久久| 欧美成人激情视频免费观看| 久久国产加勒比精品无码| 精品久久久香蕉免费精品视频| xxx欧美精品| 中文字幕在线观看日韩| 久久免费视频在线观看| 久久影院中文字幕| 日韩精品免费在线视频| 丝袜亚洲欧美日韩综合| 色噜噜狠狠狠综合曰曰曰88av| 欧美成人精品一区二区| 亚洲精品720p| 国产成人综合久久| 日韩精品高清在线| 91久久久久久久一区二区| 黑人狂躁日本妞一区二区三区| 久久久久久久久久久网站| 日韩av在线最新| 97碰碰碰免费色视频| 国产精品夜间视频香蕉| 国产精品白嫩美女在线观看| 亚洲大尺度美女在线| 午夜精品视频在线| 日韩电影在线观看永久视频免费网站| 国产一区二区三区在线播放免费观看| 欧美成人亚洲成人| 欧美成人激情图片网| 欧美精品久久久久久久| 国产精自产拍久久久久久| 欧美疯狂性受xxxxx另类| 欧美交受高潮1| 欧美电影在线免费观看网站| 日本三级韩国三级久久| 中文字幕免费精品一区高清| 青青久久av北条麻妃黑人| 日韩在线播放av| 九色精品美女在线| 色妞久久福利网| 欧美俄罗斯性视频| 亚洲毛片在线免费观看| 久久久国产精彩视频美女艺术照福利| 日韩视频亚洲视频| 91久久久久久| 91产国在线观看动作片喷水| 亚洲高清久久久久久| 欧美黄色小视频| 色777狠狠综合秋免鲁丝| 国产精品 欧美在线| 亚洲美女av电影| 欧美多人乱p欧美4p久久| 亚洲欧美日韩国产中文| 成人黄在线观看| 久久久精品在线| 日韩最新中文字幕电影免费看| 国产亚洲日本欧美韩国| 亚洲男女性事视频| 亚洲网站视频福利| 97精品视频在线| 精品网站999www| 97久久精品国产| 欧美精品电影在线| 久久久av亚洲男天堂| 日韩精品视频三区| 国产成人亚洲综合91| 国产亚洲一区精品| 91九色国产视频| 久久琪琪电影院| 97视频在线观看免费高清完整版在线观看| 午夜免费日韩视频| 亚洲综合日韩中文字幕v在线| 欧美富婆性猛交| 国产日韩欧美日韩| 国产美女搞久久| 欧美激情一二三| 久久久久国产视频| 国产一区二区丝袜| 97久久超碰福利国产精品…| 欧美日韩国产精品专区| 免费av一区二区| 国产一区二区三区高清在线观看| www.欧美免费| 久久精品视频在线| 清纯唯美亚洲综合| 欧美日韩成人在线视频| 成人精品在线视频| 精品一区二区三区三区| 国产精品99久久久久久久久| 欧美日韩国产成人在线| 国产日韩视频在线观看| 国内精品视频久久| 中文字幕欧美精品日韩中文字幕| 国产成人精品免费视频| 国精产品一区一区三区有限在线| 欧美激情一级精品国产| 亚洲娇小xxxx欧美娇小| 另类视频在线观看| 爽爽爽爽爽爽爽成人免费观看| 久久精品这里热有精品|