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

首頁 > 編程 > PHP > 正文

Laravel核心解讀Request

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

Request

很多框架都會將來自客戶端的請求抽象成類方便html' target='_blank'>應用程序使用,在Laravel中也不例外。Illuminate/Http/Request類在Laravel框架中就是對客戶端請求的抽象,它是構建在Symfony框架提供的Request組件基礎之上的。今天這篇文章就簡單來看看Laravel是怎么創建請求Request對象的,而關于Request對象為應用提供的能力我并不會過多去說,在我講完創建過程后你也就知道去源碼哪里找Request對象提供的方法了,網上有些速查表列舉了一些Request提供的方法不過不夠全并且有的也沒有解釋,所以我還是推薦在開發中如果好奇Request是否已經實現了你想要的能力時去Request的源碼里看下有沒有提供對應的方法,方法注釋里都清楚地標明了每個方法的執行結果。下面讓我們進入正題吧。

創建Request對象

我們可以在Laravel應用程序的index.php文件中看到,在Laravel應用程序正式啟動完成前Request對象就已經被創建好了:

//public/index.php$app = require_once __DIR__. /../bootstrap/app.php $kernel = $app- make(Illuminate/Contracts/Http/Kernel::class);$response = $kernel- handle( //創建request對象 $request = Illuminate/Http/Request::capture());

客戶端的HTTP請求是Illuminate/Http/Request類的對象

class Request extends SymfonyRequest implements Arrayable, ArrayAccess //新建Request實例 public static function capture() static::enableHttpMethodParameterOverride(); return static::createFromBase(SymfonyRequest::createFromGlobals());}

通過Illuminate/Http/Request類的源碼可以看到它是繼承自Symfony Request類的,所以Illuminate/Http/Request類中實現的很多功能都是以Symfony Reques提供的功能為基礎來實現的。上面的代碼就可以看到capture方法新建Request對象時也是依賴于Symfony Request類的實例的。

namespace Symfony/Component/HttpFoundation;class Request * 根據PHP提供的超級全局數組來創建Smyfony Request實例 * @return static public static function createFromGlobals() // With the php s bug #66606, the php s built-in web server // stores the Content-Type and Content-Length header values in // HTTP_CONTENT_TYPE and HTTP_CONTENT_LENGTH fields. $server = $_SERVER; if ( cli-server === PHP_SAPI) { if (array_key_exists( HTTP_CONTENT_LENGTH , $_SERVER)) { $server[ CONTENT_LENGTH ] = $_SERVER[ HTTP_CONTENT_LENGTH  if (array_key_exists( HTTP_CONTENT_TYPE , $_SERVER)) { $server[ CONTENT_TYPE ] = $_SERVER[ HTTP_CONTENT_TYPE  $request = self::createRequestFromFactory($_GET, $_POST, array(), $_COOKIE, $_FILES, $server); if (0 === strpos($request- headers- get( CONTENT_TYPE ), application/x-www-form-urlencoded ) in_array(strtoupper($request- server- get( REQUEST_METHOD , GET )), array( PUT , DELETE , PATCH )) parse_str($request- getContent(), $data); $request- request = new ParameterBag($data); return $request;}

上面的代碼有一處需要額外解釋一下,自PHP5.4開始PHP內建的builtin web server可以通過命令行解釋器來啟動,例如:

php -S localhost:8000 -t htdocs

-S addr : port Run with built-in web server.-t docroot Specify document root docroot for built-in web server.

但是內建web server有一個bug是將CONTENT_LENGTH和CONTENT_TYPE這兩個請求首部存儲到了HTTP_CONTENT_LENGTH和HTTP_CONTENT_TYPE中,為了統一內建服務器和真正的server中的請求首部字段所以在這里做了特殊處理。

Symfony Request 實例的創建是通過PHP中的超級全局數組來創建的,這些超級全局數組有$_GET,$_POST,$_COOKIE,$_FILES,$_SERVER涵蓋了PHP中所有與HTTP請求相關的超級全局數組,創建Symfony Request實例時會根據這些全局數組創建Symfony Package里提供的ParamterBag ServerBag FileBag HeaderBag實例,這些Bag都是Symfony提供地針對不同HTTP組成部分的訪問和設置API, 關于Symfony提供的ParamterBag這些實例有興趣的讀者自己去源碼里看看吧,這里就不多說了。

class Request * @param array $query The GET parameters * @param array $request The POST parameters * @param array $attributes The request attributes (parameters parsed from the PATH_INFO, ...) * @param array $cookies The COOKIE parameters * @param array $files The FILES parameters * @param array $server The SERVER parameters * @param string|resource|null $content The raw body data public function __construct(array $query = array(), array $request = array(), array $attributes = array(), array $cookies = array(), array $files = array(), array $server = array(), $content = null) $this- initialize($query, $request, $attributes, $cookies, $files, $server, $content); public function initialize(array $query = array(), array $request = array(), array $attributes = array(), array $cookies = array(), array $files = array(), array $server = array(), $content = null) $this- request = new ParameterBag($request); $this- query = new ParameterBag($query); $this- attributes = new ParameterBag($attributes); $this- cookies = new ParameterBag($cookies); $this- files = new FileBag($files); $this- server = new ServerBag($server); $this- headers = new HeaderBag($this- server- getHeaders()); $this- content = $content; $this- languages = null; $this- charsets = null; $this- encodings = null; $this- acceptableContentTypes = null; $this- pathInfo = null; $this- requestUri = null; $this- baseUrl = null; $this- basePath = null; $this- method = null; $this- format = null;}

可以看到Symfony Request類除了上邊說到的那幾個,還有很多屬性,這些屬性在一起構成了對HTTP請求完整的抽象,我們可以通過實例屬性方便地訪問Method,Charset等這些HTTP請求的屬性。

拿到Symfony Request實例后, Laravel會克隆這個實例并重設其中的一些屬性:

namespace Illuminate/Http;class Request extends .... //在Symfony request instance的基礎上創建Request實例 public static function createFromBase(SymfonyRequest $request) if ($request instanceof static) { return $request; $content = $request- content; $request = (new static)- duplicate( $request- query- all(), $request- request- all(), $request- attributes- all(), $request- cookies- all(), $request- files- all(), $request- server- all() $request- content = $content; $request- request = $request- getInputSource(); return $request; public function duplicate(array $query = null, array $request = null, array $attributes = null, array $cookies = null, array $files = null, array $server = null) return parent::duplicate($query, $request, $attributes, $cookies, $this- filterFiles($files), $server); //Symfony Request中的 duplicate方法 public function duplicate(array $query = null, array $request = null, array $attributes = null, array $cookies = null, array $files = null, array $server = null) $dup = clone $this; if (null !== $query) { $dup- query = new ParameterBag($query); if (null !== $request) { $dup- request = new ParameterBag($request); if (null !== $attributes) { $dup- attributes = new ParameterBag($attributes); if (null !== $cookies) { $dup- cookies = new ParameterBag($cookies); if (null !== $files) { $dup- files = new FileBag($files); if (null !== $server) { $dup- server = new ServerBag($server); $dup- headers = new HeaderBag($dup- server- getHeaders()); $dup- languages = null; $dup- charsets = null; $dup- encodings = null; $dup- acceptableContentTypes = null; $dup- pathInfo = null; $dup- requestUri = null; $dup- baseUrl = null; $dup- basePath = null; $dup- method = null; $dup- format = null; if (!$dup- get( _format ) $this- get( _format )) { $dup- attributes- set( _format , $this- get( _format  if (!$dup- getRequestFormat(null)) { $dup- setRequestFormat($this- getRequestFormat(null)); return $dup; }

Request對象創建好后在Laravel應用中我們就能方便的應用它提供的能力了,在使用Request對象時如果你不知道它是否實現了你想要的功能,很簡單直接去Illuminate/Http/Request的源碼文件里查看就好了,所有方法都列在了這個源碼文件里,比如:

/** * Get the full URL for the request. * 獲取請求的URL(包含host, 不包括query string) * @return stringpublic function fullUrl() $query = $this- getQueryString(); $question = $this- getBaseUrl().$this- getPathInfo() == / ? /? : ?  return $query ? $this- url().$question.$query : $this- url(); * Get the full URL for the request with the added query string parameters. * 獲取包括了query string 的完整URL * @param array $query * @return stringpublic function fullUrlWithQuery(array $query) $question = $this- getBaseUrl().$this- getPathInfo() == / ? /? : ?  return count($this- query()) 0 ? $this- url().$question.http_build_query(array_merge($this- query(), $query)) : $this- fullUrl().$question.http_build_query($query);}
Request經過的驛站

創建完Request對象后, Laravel的Http Kernel會接著往下執行:加載服務提供器引導Laravel應用、啟動應用、讓Request經過基礎的中間件、通過Router匹配查找Request對應的路由、執行匹配到的路由、Request經過路由上到中間件到達控制器方法。

總結

隨著Request最終到達對應的控制器方法后它的使命基本上也就完成了, 在控制器方法里從Request中獲取輸入參數然后執行應用的某一業務邏輯獲得結果,結果會被轉化成Response響應對象返回給發起請求的客戶端。

這篇文章主要梳理了Laravel中Request對象,主要是想讓大家知道如何去查找Laravel中Request現有提供了哪些能力供我們使用避免我們在業務代碼里重新造輪子去實現Request已經提供的方法。

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

相關推薦:

Laravel核心解讀Facades

Laravel中間件(Middleware)的解讀

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

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品亚洲永久免费精品| 久久久久久久成人| 亚洲综合在线中文字幕| 最近2019好看的中文字幕免费| 亚洲乱码国产乱码精品精天堂| 亚洲女在线观看| 91九色视频导航| 久久久久99精品久久久久| 91久久久久久久久久久| 91精品免费久久久久久久久| 91视频免费网站| 福利微拍一区二区| 91青草视频久久| 九九九热精品免费视频观看网站| 国产一区二区日韩精品欧美精品| 欧美日韩一二三四五区| 国产成一区二区| 日韩精品免费在线观看| 色婷婷成人综合| 日韩av综合网站| 国产精品草莓在线免费观看| 俺也去精品视频在线观看| 91日韩在线播放| 国产精品私拍pans大尺度在线| 久久影院中文字幕| 亚洲人成毛片在线播放| 日韩欧美在线网址| 美日韩精品免费观看视频| 亚洲欧美日韩中文在线制服| 欧美壮男野外gaytube| 色噜噜狠狠狠综合曰曰曰88av| 亚洲丁香婷深爱综合| 黑人巨大精品欧美一区二区| 久久免费视频这里只有精品| 成人精品一区二区三区电影黑人| 91精品国产沙发| 欧美国产日韩视频| 正在播放国产一区| 欧美激情一区二区久久久| 欧美精品一本久久男人的天堂| 亚洲国产一区二区三区四区| 国产热re99久久6国产精品| 欧美激情精品久久久久久免费印度| 国产精品视频久| 欧美又大又硬又粗bbbbb| 亚洲区中文字幕| 精品国产乱码久久久久久虫虫漫画| 狠狠躁夜夜躁人人爽天天天天97| 国产精品视频999| 亚洲免费电影一区| 91人成网站www| 亚洲人成亚洲人成在线观看| 亚洲欧美在线免费观看| 亚洲理论电影网| 在线成人激情黄色| 欧美疯狂做受xxxx高潮| 亚洲精品永久免费| 日韩中文字幕在线播放| 日本一区二区在线播放| 国产精品流白浆视频| 91国产高清在线| 国产精品日韩在线观看| 欧美在线免费看| 日韩在线欧美在线国产在线| 国产日韩在线观看av| 欧美一级淫片videoshd| 综合国产在线视频| 日韩三级影视基地| 成人444kkkk在线观看| 日韩欧美在线一区| 狠狠躁天天躁日日躁欧美| 成人午夜激情网| 国产日韩在线看片| 国外视频精品毛片| 久久手机精品视频| 国产午夜精品美女视频明星a级| 午夜免费在线观看精品视频| 日韩欧美国产激情| 蜜臀久久99精品久久久久久宅男| 国产精品一区二区女厕厕| 91九色单男在线观看| 日韩中文字幕视频在线| 欧美重口另类videos人妖| 91亚洲精品一区| 北条麻妃一区二区在线观看| 日韩欧美成人免费视频| 青草青草久热精品视频在线观看| 欧美色播在线播放| 日韩av有码在线| 国产国语videosex另类| 91美女片黄在线观看游戏| 在线观看免费高清视频97| 丝袜一区二区三区| www.日韩视频| 亚洲高清久久久久久| 美女啪啪无遮挡免费久久网站| 亚洲女人天堂网| 国产精品观看在线亚洲人成网| 欧美影院久久久| 欧美日韩ab片| 久久精品这里热有精品| 69精品小视频| 亚洲二区中文字幕| 午夜精品久久久久久久99黑人| 亚洲福利在线观看| 国产a∨精品一区二区三区不卡| 狠狠色狠狠色综合日日五| 91精品在线观| 欧美孕妇孕交黑巨大网站| 国产欧美精品一区二区| 亚洲成人激情视频| 欧美日本高清一区| 亚洲福利视频免费观看| 欧美精品情趣视频| 欧美日韩一区二区在线播放| 8x海外华人永久免费日韩内陆视频| 欧美二区乱c黑人| 91九色国产视频| 日韩精品极品在线观看| 欧美性在线视频| 久久手机免费视频| 欧美另类在线播放| 日产精品久久久一区二区福利| 亚洲成av人影院在线观看| 欧美日韩一区二区三区| 欧美精品成人91久久久久久久| 成人国产精品一区二区| 国产区亚洲区欧美区| 日韩精品黄色网| 成人欧美在线视频| 日韩中文字幕在线播放| 欧美一级片久久久久久久| 精品国产一区二区三区久久久狼| 日韩有码片在线观看| 久久国产精品免费视频| 亚洲品质视频自拍网| 中文字幕无线精品亚洲乱码一区| 国产精品久久综合av爱欲tv| 日韩在线国产精品| 成人免费在线视频网站| 青草青草久热精品视频在线观看| 国产精品嫩草影院一区二区| 一区二区欧美日韩视频| 97免费在线视频| 国产主播在线一区| 日韩av在线免费观看一区| 亚洲精品自拍偷拍| 亚洲国产日韩欧美在线动漫| 亚洲精品99久久久久中文字幕| 这里只有精品在线观看| 欧美国产日韩视频| 色一区av在线| 国产主播在线一区| 精品视频在线观看日韩| 国产精品专区一| 国产精品网站大全| 国产精品高潮呻吟久久av野狼| 91中文在线视频| 2019中文字幕在线免费观看| 91精品久久久久久久久久久久久| 亚洲国产欧美在线成人app| 日韩美女av在线免费观看| 成人免费看黄网站| 91干在线观看|