摘要:路由執(zhí)行代碼展示控制器形式匿名函數(shù)形式控制器形式處理控制器參數(shù)解析返回過濾的從路徑或主機名解析出來的對應(yīng)的參數(shù)數(shù)組,類似方式調(diào)用控制器的方法可以有自己的區(qū)別于路由參數(shù)的
Laravel 路由執(zhí)行 代碼展示
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() ); }); } public function run() { $this->container = $this->container ?: new Container; try { // 控制器形式(Controller@Method) if ($this->isControllerAction()) { return $this->runController(); } // 匿名函數(shù)形式 return $this->runCallable(); } catch (HttpResponseException $e) { return $e->getResponse(); } }控制器形式處理
protected function runController() { return (new ControllerDispatcher($this->container))->dispatch( $this, $this->getController(), $this->getControllerMethod() ); } public function getController() { $class = $this->parseControllerCallback()[0]; if (! $this->controller) { $this->controller = $this->container->make($class); } return $this->controller; } protected function getControllerMethod() { return $this->parseControllerCallback()[1]; } protected function parseControllerCallback() { return Str::parseCallback($this->action["uses"]); } public static function parseCallback($callback, $default = null) { return static::contains($callback, "@") ? explode("@", $callback, 2) : [$callback, $default]; } // IlluminateRoutingControllerDispatcher public function __construct(Container $container) { $this->container = $container; } public function dispatch(Route $route, $controller, $method) { // 控制器參數(shù)解析 $parameters = $this->resolveClassMethodDependencies( $route->parametersWithoutNulls(), $controller, $method ); if (method_exists($controller, "callAction")) { return $controller->callAction($method, $parameters); } return $controller->{$method}(...array_values($parameters)); } public function parametersWithoutNulls() { // 返回過濾的從路徑或主機名解析出來的對應(yīng)的參數(shù)數(shù)組,類似 ["post"=>1,"comment"=>2] return array_filter($this->parameters(), function ($p) { return ! is_null($p); }); } protected function resolveClassMethodDependencies(array $parameters, $instance, $method) { // __invoke 方式調(diào)用 if (! method_exists($instance, $method)) { return $parameters; } return $this->resolveMethodDependencies( $parameters, new ReflectionMethod($instance, $method) ); } // 控制器的方法可以有自己的區(qū)別于路由參數(shù)的類類型參數(shù),其他參數(shù)只能從路由獲取 public function resolveMethodDependencies(array $parameters, ReflectionFunctionAbstract $reflector) { $results = []; $instanceCount = 0; $values = array_values($parameters); foreach ($reflector->getParameters() as $key => $parameter) { // 類方法自己的類類型參數(shù),嘗試實例化 $instance = $this->transformDependency( $parameter, $parameters ); if (! is_null($instance)) { $instanceCount++; $results[] = $instance; } else { // 按照類方法的參數(shù)順序依次存放數(shù)據(jù) $results[] = isset($values[$key - $instanceCount]) ? $values[$key - $instanceCount] : $parameter->getDefaultValue(); } } return $results; } protected function transformDependency(ReflectionParameter $parameter, $parameters) { $class = $parameter->getClass(); // 類類型且沒有實例化,則通過服務(wù)容器解決參數(shù)的依賴關(guān)系,并進(jìn)行實例化 if ($class && ! $this->alreadyInParameters($class->name, $parameters)) { return $this->container->make($class->name); } } protected function alreadyInParameters($class, array $parameters) { return ! is_null(Arr::first($parameters, function ($value) use ($class) { return $value instanceof $class; })); } public function callAction($method, $parameters) { return call_user_func_array([$this, $method], $parameters); }
小結(jié):
主要就是將路由獲取到的參數(shù)依次對應(yīng)到控制器方法的參數(shù),當(dāng)然控制器方法可以有自己的類類型參數(shù)
protected function runCallable() { $callable = $this->action["uses"]; // 一樣的處理方式 return $callable(...array_values($this->resolveMethodDependencies( $this->parametersWithoutNulls(), new ReflectionFunction($this->action["uses"]) ))); }返回
即控制器的返回
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/22613.html
摘要:合適和夠用是最完美的追求。比如從頁面去請求的資源。它允許瀏覽器向跨源服務(wù)器,發(fā)出請求,從而克服了只能同源使用的限制。定義在中的路由都是無狀態(tài)的,并且會應(yīng)用中間件組。 關(guān)于作者 程序開發(fā)人員,不拘泥于語言與技術(shù),目前主要從事PHP和前端開發(fā),使用Laravel和VueJs,App端使用Apicloud混合式開發(fā)。合適和夠用是最完美的追求。 個人網(wǎng)站:http://www.linganm...
摘要:合適和夠用是最完美的追求。比如從頁面去請求的資源。它允許瀏覽器向跨源服務(wù)器,發(fā)出請求,從而克服了只能同源使用的限制。定義在中的路由都是無狀態(tài)的,并且會應(yīng)用中間件組。 關(guān)于作者 程序開發(fā)人員,不拘泥于語言與技術(shù),目前主要從事PHP和前端開發(fā),使用Laravel和VueJs,App端使用Apicloud混合式開發(fā)。合適和夠用是最完美的追求。 個人網(wǎng)站:http://www.linganm...
摘要:合適和夠用是最完美的追求。比如從頁面去請求的資源。它允許瀏覽器向跨源服務(wù)器,發(fā)出請求,從而克服了只能同源使用的限制。定義在中的路由都是無狀態(tài)的,并且會應(yīng)用中間件組。 關(guān)于作者 程序開發(fā)人員,不拘泥于語言與技術(shù),目前主要從事PHP和前端開發(fā),使用Laravel和VueJs,App端使用Apicloud混合式開發(fā)。合適和夠用是最完美的追求。 個人網(wǎng)站:http://www.linganm...
摘要:而我的新輪子也并不是專門解決它的問題的,而是順便解決而已。概述這個包,支持在所有的項目中使用。一旦出現(xiàn)成員,代表允許全部。列出允許跨域請求的方法列表,默認(rèn)是代表所有方法。信息地址嗯,新輪子,求一波。 showImg(https://segmentfault.com/img/bV5VxN?w=844&h=656); 是的,可能了解 Laravel 的都知道,在 Laravel 中簡單的設(shè)...
摘要:在每一個的項目主頁上,展示了擴(kuò)展包的介紹版本號倉庫地址如完整的文件,以及其他一些有用的信息。官方文檔給出了總結(jié)服務(wù)提供者是所有應(yīng)用程序引導(dǎo)中心。你可以瀏覽位于目錄下的所有應(yīng)用程序服務(wù)提供者。 showImg(https://segmentfault.com/img/bV6vPF?w=1200&h=500); 當(dāng)你接手一個新項目的時候,可能會感到無從下手,如果不熟悉編程,則更是如此。那么...
閱讀 2574·2021-10-08 10:04
閱讀 2735·2021-09-06 15:02
閱讀 792·2019-08-30 13:50
閱讀 1547·2019-08-30 13:21
閱讀 2586·2019-08-30 11:15
閱讀 2113·2019-08-29 17:19
閱讀 1574·2019-08-26 13:55
閱讀 1261·2019-08-26 10:15