通过源代码分析Laravel的依赖注入
前言
众所周知,php有无数的框架。近年来,一个以优雅著称的框架逐渐被国内phper所熟知并开始使用。然而,larave有一个明显的缺点,那就是他的文档内容很差。
本文将为大家详细介绍Laravel依赖注入,并分享给大家参考。下面就不多说了。我们来看看详细的介绍。
在Laravel中控制器的构造方法或成员方法中,依赖注入可以通过类型约束来使用,例如:
公共函数存储(Request $request) {//todo}这里,$request参数使用类型约束,请求是一个类:\Illuminate\Http\Request,表示参数必须是这个类或者子类。
在本文中,通过分析Laravel的源代码,我们可以看到为什么我们可以直接使用Request而不用传入一个实例。只是框架会自动为我们实例化和传递参数。
1.路线定义
从源头来看,这样的路由是在路由定义文件中定义的:
route : resource(“/role”、“Admin \ role controller”);这是一个基于资源的路由,Laravel会自动生成路由条目,用于添加、删除和修改。
本文开头的store方法是一个控制器方法。从图中可以看出,路由定义的Action也是:app \ http \ controllers \ admin \[email protected]
路由方法分析
根据路由定义,找到控制器和方法,并在调度方法中实现具体的方法。
(文件:vendor/laravel/framework/src/light/routing/controller dispatcher . PHP)
公共函数分派(Route $route,$controller,$ method){ $ parameters=$ this-resolveclasmethod dependencies($ Route-parameters swithoutnulls(),$controller,$ method);if (method_exists($controller,' callAction '){ return $ controller-callAction($ method,$ parameters);}返回$controller-{$method}(.array _ values($ parameters));}首先,resolveClassMethodDependencies方法,“顾名思义”,根据类的方法参数获取依赖对象,然后调用类的方法并注入对象参数。
如果有多个依赖对象,它们将由foreach依次解析并作为参数注入。
获取从属对象示例的代码:
受保护的函数resolveclasmethodependencies(array $ parameters,$instance,$method){ if(!method_exists($instance,$ method)){ return $参数;}返回$ this-resolvememethodependencies($ parameters,new ReflectionMethod($instance,$ method));}这里的重点是使用PHP反射,注意RelectionMethod方法,它获取类的方法参数列表,可以知道参数的类型约束、参数名称等等。
这里的$instance参数是RoleController类,$method参数是方法名strore。
2.获取从属对象的示例
从方法的参数中获取依赖对象的约束类型,然后可以实例化依赖对象。
受保护的函数transformDependency(ReflectionParameter $ parameter,$ parameters){ $ class=$ parameter-getClass();//如果参数有类型提示类,我们将检查它是否已经在//参数列表中。如果是,我们将跳过它,因为它可能是一个模型//绑定,我们不想弄乱它们;否则,我们在这里解决。if ($class!$ this-AlreadyinParameters($ class-name,$ parameters)){ return $ parameter-IsDefaultValueAvailable()?$ parameter-getDefaultValue()$ : this-container-make($ class-name);}}根据类名从容器中获取对象。绑定对象实例的这个过程在服务提供者中定义和。
然后将实例化的对象传递给store方法,就可以使用依赖对象了。
3.关于PHP反射
举一个使用ReflectionMethod的例子。
类Demo { private $请求;public function store(request $ request){ } }打印出新反射方法(demo :类,“store”)的内容,如下图所示:
您可以获得此方法的参数列表和参数的约束类型,如typeHint、Lighting \ Http \ Request。
根据类名,您可以从容器中获取最初由服务提供者绑定的实例。
摘要
以上就是本文的全部内容。希望本文的内容对大家的学习或工作有一定的参考价值。有问题可以留言交流。谢谢你的支持。
版权声明:通过源代码分析Laravel的依赖注入是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。