摘要:接著上篇分割線是的實(shí)例,但是文件中找不到方法在類內(nèi)部看到,打開找到了方法,方法注釋寫的是主要用于運(yùn)行應(yīng)用以及發(fā)送響應(yīng)主要看方法
接著上篇$app->run();
--------------------分割線------------------------
$app是Application的實(shí)例,但是Application.php文件中找不到run方法
在類內(nèi)部看到use ConcernsRoutesRequests,打開找到了run方法,
run方法注釋寫的是主要用于運(yùn)行應(yīng)用以及發(fā)送響應(yīng)
/** * Run the application and send the response. * * @param SymfonyRequest|null $request * @return void */ public function run($request = null) { $response = $this->dispatch($request); if ($response instanceof SymfonyResponse) { $response->send(); } else { echo (string) $response; } if (count($this->middleware) > 0) { $this->callTerminableMiddleware($response); } }
主要看dispatch方法
/** * Dispatch the incoming request. * * @param SymfonyRequest|null $request * @return Response */ public function dispatch($request = null) { list($method, $pathInfo) = $this->parseIncomingRequest($request); try { return $this->sendThroughPipeline($this->middleware, function () use ($method, $pathInfo) { if (isset($this->router->getRoutes()[$method.$pathInfo])) { return $this->handleFoundRoute([true, $this->router->getRoutes()[$method.$pathInfo]["action"], []]); } return $this->handleDispatcherResponse( $this->createDispatcher()->dispatch($method, $pathInfo) ); }); } catch (Exception $e) { return $this->prepareResponse($this->sendExceptionToHandler($e)); } catch (Throwable $e) { return $this->prepareResponse($this->sendExceptionToHandler($e)); } }
因?yàn)檎埱蟮腢RL是 api.com/index.php/
$method.$pathInfo 打印出來是 array(1) { [0]=> string(4) "GET/" }
$this->router->getRoutes()是獲取在web.php定義的所有路由,返回的是一個數(shù)組形式的數(shù)據(jù):
array (size=3) "GET/" => array (size=3) "method" => string "GET" (length=3) "uri" => string "/" (length=1) "action" => array (size=1) 0 => object(Closure)[10] public "static" => array (size=1) "router" => object(LaravelLumenRoutingRouter)[6] public "app" => ......
所以isset($this->router->getRoutes()[$method.$pathInfo]) 的結(jié)果就是 true
接著調(diào)用handleFoundRoute方法
/** * Handle a route found by the dispatcher. * * @param array $routeInfo * @return mixed */ protected function handleFoundRoute($routeInfo) { $this->currentRoute = $routeInfo; $this["request"]->setRouteResolver(function () { return $this->currentRoute; }); $action = $routeInfo[1]; // Pipe through route middleware... if (isset($action["middleware"])) { $middleware = $this->gatherMiddlewareClassNames($action["middleware"]); return $this->prepareResponse($this->sendThroughPipeline($middleware, function () { return $this->callActionOnArrayBasedRoute($this["request"]->route()); })); } return $this->prepareResponse( $this->callActionOnArrayBasedRoute($routeInfo) ); }
如果有配置中間件的話還會有中間件的處理(后面再寫中間件的學(xué)習(xí))
匹配到web.php里面的這個路由后
看到這段代碼$this->callActionOnArrayBasedRoute($routeInfo)
/** * Call the Closure on the array based route. * * @param array $routeInfo * @return mixed */ protected function callActionOnArrayBasedRoute($routeInfo) { $action = $routeInfo[1]; if (isset($action["uses"])) { return $this->prepareResponse($this->callControllerAction($routeInfo)); } foreach ($action as $value) { if ($value instanceof Closure) { $closure = $value->bindTo(new RoutingClosure); break; } } try { return $this->prepareResponse($this->call($closure, $routeInfo[2])); } catch (HttpResponseException $e) { return $e->getResponse(); } }
里面就是處理路由對應(yīng)的響應(yīng)方式,并且組裝響應(yīng)數(shù)據(jù)準(zhǔn)備返回
定義的路由是
$router->get("/", function () use ($router) { return $router->app->version(); });
匹配到路由之后對應(yīng)的處理是
function () use ($router) { return $router->app->version(); //"Lumen (5.5.2) (Laravel Components 5.5.*)" }
所以$this->call($closure, $routeInfo[2])
得到的就是上一節(jié)的"Lumen (5.5.2) (Laravel Components 5.5.*)"
然后把處理后得到的數(shù)據(jù)傳進(jìn)$this->prepareResponse()方法中組裝響應(yīng)請求的數(shù)據(jù)
組裝完畢后,回到最初的run方法接著往下$response->send()
追蹤到SymfonyComponentHttpFoundationResponse這個類里面(組裝響應(yīng)數(shù)據(jù)也是這里面)
/** * Sends content for the current web response. * * @return $this */ public function sendContent() { echo $this->content; return $this; } /** * Sends HTTP headers and content. * * @return $this */ 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; }
從這里看出,那段"Lumen (5.5.2) (Laravel Components 5.5.*)"就是在這里echo出來的
到此為止,可以大概知道了框架從請求到響應(yīng)的基本流程
其中還有一些中間件,事件監(jiān)聽等知識后續(xù)學(xué)習(xí)補(bǔ)上,有什么不對記得指出,互相學(xué)習(xí)~
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/26184.html
摘要:繼續(xù)學(xué)習(xí)分割線看看是怎么輸出這個數(shù)據(jù)目錄下的加載了下的的自動加載加載的配置初始化應(yīng)用初始化的內(nèi)容指定項(xiàng)目基礎(chǔ)目錄注冊服務(wù)容器注冊異常處理實(shí)例 繼續(xù)學(xué)習(xí)lumen5.5 -----------------------分割線----------------------- 看看是怎么輸出Lumen (5.5.2) (Laravel Components 5.5.*)這個數(shù)據(jù) public目錄...
摘要:最近在學(xué)習(xí)框架寫接口,記憶力比較差所以順便寫下筆記分割線因?yàn)橹苯訉W(xué)最新版的所以,記得開啟的,,擴(kuò)展還有可以用的打開命令 最近在學(xué)習(xí)lumen框架寫API接口,記憶力比較差所以順便寫下筆記~ -----------------------------分割線-------------------------------- 因?yàn)橹苯訉W(xué)最新版的所以,PHP >=7.0記得開啟php.ini的o...
摘要:想要做到這一點(diǎn),你需要定義中間件為。如果你希望在及方法被調(diào)用時使用一致的中間件實(shí)例,只需在容器中使用容器的方法注冊中間件以上就是路由和中間件的學(xué)習(xí),最后那那其實(shí)理解得有點(diǎn)虛,有錯記得指出修正,謝謝 前幾篇了解完從請求到響應(yīng)的流程后,仔細(xì)學(xué)習(xí)下路由和中間件的玩法 ----------------------------------分割線--------------------------...
摘要:打開瀏覽器輸入,如無意外,將出現(xiàn)如下圖,表示框架安裝成功。四系統(tǒng)內(nèi)部后臺管理系統(tǒng)這個是框架自帶的后臺登錄管理系統(tǒng),只需要簡單的命令即可運(yùn)行。出現(xiàn)上圖即為,創(chuàng)建模型成功。 在PHP個各種web開發(fā)框架中,laravel算是一款簡潔、優(yōu)雅的開發(fā)框架,本人也剛剛接觸到laravel,通過學(xué)習(xí)大神們的一些文章,下面是我的一些心得體會,希望可以給初學(xué)者一些幫助,大家一起進(jìn)步。言歸正傳: 本人環(huán)境...
閱讀 3702·2021-11-11 10:58
閱讀 2486·2021-09-22 15:43
閱讀 2875·2019-08-30 15:44
閱讀 2196·2019-08-30 13:08
閱讀 1827·2019-08-29 17:28
閱讀 893·2019-08-29 10:54
閱讀 683·2019-08-26 11:46
閱讀 3512·2019-08-26 11:43