We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
本章节以前面没有分析完成的 02. HTTP Kernel Handle 解析 和 06. RouteServiceProvider 详解 做铺垫,通过讲述其最后 runController 的内部逻辑,抛砖引玉,分析 Laravel 依赖注入的原理, 因为前面我们讲了容器对象的绑定的实现 (见:10. 容器的 singleton 和 bind 的实现),所以在这里不再详述。
本章节以前面没有分析完成的 02. HTTP Kernel Handle 解析 和 06. RouteServiceProvider 详解 做铺垫,通过讲述其最后 runController 的内部逻辑,抛砖引玉,分析 Laravel 依赖注入的原理,
runController
因为前面我们讲了容器对象的绑定的实现 (见:10. 容器的 singleton 和 bind 的实现),所以在这里不再详述。
在大型项目中,因为类的繁多,彼此需要调用到的代码的更多,如果我们在用到对象的每一个地方去 new FooClass(... $parameters ),那么我们的项目重复代码太多,早晚会失去优雅性和可维护性。 所以依赖注入就是在用到一个对象的方法入参声明,你要什么对象,他基于什么实现。框架 (亦或独立的 容器服务 )在执行到这里的时候,发现你声明了需要那几个对象,在 容器服务 里找到这几个对象的实例化逻辑,实例化出来扔进去执行。
在大型项目中,因为类的繁多,彼此需要调用到的代码的更多,如果我们在用到对象的每一个地方去 new FooClass(... $parameters ),那么我们的项目重复代码太多,早晚会失去优雅性和可维护性。
new FooClass(... $parameters )
所以依赖注入就是在用到一个对象的方法入参声明,你要什么对象,他基于什么实现。框架 (亦或独立的 容器服务 )在执行到这里的时候,发现你声明了需要那几个对象,在 容器服务 里找到这几个对象的实例化逻辑,实例化出来扔进去执行。
框架
容器服务
laravel/vendor/laravel/framework/src/Illuminate/Routing/Route.php
Lines 202 to 214 in d081c91
这里的 Route 对象本身已经是单个路由了,所以 $this->getController() 和 $this->getControllerMethod() 取得的具体的 Controller 类名和方法名。
Route
$this->getController()
$this->getControllerMethod()
核心代码其实就是这个 $this->controllerDispatcher()->dispatch() 方法了
$this->controllerDispatcher()->dispatch()
laravel/vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php
Lines 30 to 49 in d081c91
第一步 解析参数
Lines 40 to 42 in d081c91
resolveClassMethodDependencies 的实现
resolveClassMethodDependencies
laravel/vendor/laravel/framework/src/Illuminate/Routing/RouteDependencyResolverTrait.php
Lines 12 to 29 in d081c91
其中
Lines 22 to 24 in d081c91
为什么没报错,是考虑到 controller 也是可以用 __call 魔术方法来绑定路由的。
__call
resolveMethodDependencies 的逻辑就是将传入的反射对象的入参解析完成
resolveMethodDependencies
Lines 31 to 60 in d081c91
紧接前文代码
Lines 62 to 81 in d081c91
[划重点,前方高能] 如果此参数为一个类,且不是路由中出现的参数,返回 默认值(如有),否则从容器创建
Line 79 in d081c91
dispatch 方法的下半段
dispatch
Lines 44 to 48 in d081c91
如果控制器定义了 callAction,执行。 接着直接调用 controller 的方法。
callAction
The text was updated successfully, but these errors were encountered:
No branches or pull requests
定义
路由执行中的依赖注入的实现
解析反射
laravel/vendor/laravel/framework/src/Illuminate/Routing/Route.php
Lines 202 to 214 in d081c91
这里的
Route
对象本身已经是单个路由了,所以$this->getController()
和$this->getControllerMethod()
取得的具体的 Controller 类名和方法名。核心代码其实就是这个
$this->controllerDispatcher()->dispatch()
方法了laravel/vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php
Lines 30 to 49 in d081c91
第一步 解析参数
laravel/vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php
Lines 40 to 42 in d081c91
resolveClassMethodDependencies
的实现laravel/vendor/laravel/framework/src/Illuminate/Routing/RouteDependencyResolverTrait.php
Lines 12 to 29 in d081c91
其中
laravel/vendor/laravel/framework/src/Illuminate/Routing/RouteDependencyResolverTrait.php
Lines 22 to 24 in d081c91
为什么没报错,是考虑到 controller 也是可以用
__call
魔术方法来绑定路由的。resolveMethodDependencies
的逻辑就是将传入的反射对象的入参解析完成laravel/vendor/laravel/framework/src/Illuminate/Routing/RouteDependencyResolverTrait.php
Lines 31 to 60 in d081c91
容器挂靠
紧接前文代码
laravel/vendor/laravel/framework/src/Illuminate/Routing/RouteDependencyResolverTrait.php
Lines 62 to 81 in d081c91
[划重点,前方高能]
如果此参数为一个类,且不是路由中出现的参数,返回 默认值(如有),否则从容器创建
laravel/vendor/laravel/framework/src/Illuminate/Routing/RouteDependencyResolverTrait.php
Line 79 in d081c91
路由的执行
dispatch
方法的下半段laravel/vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php
Lines 44 to 48 in d081c91
如果控制器定义了
callAction
,执行。接着直接调用 controller 的方法。
The text was updated successfully, but these errors were encountered: