laravel中如何利用反射实现依赖注入

依赖注入

在一个类中经常会依赖于其他的对象,先看一下经典的写法

class Foo {
    public $bar;

    public function __construct() {
        $this->bar = new Bar();
    }
}

$foo = new Foo();

当类的依赖发生改变时,比如 Bar 这个类需要实例化参数时,而依赖于它的类有很多,总不能一个一个地去修改吧。

再看一下使用 依赖注入 怎么做

class Foo {
    public $bar;

    public function __construct($bar) {
        $this->bar = $bar;
    }
}

$bar = new Bar();
//$bar = new Bar($args);
$foo = $foo = new Foo($bar);

Bar 类在外部实例化好后,作为一个参数传入进 Foo 类,从而实现了 控制反转 ,假如现在 Bar 类需要参数了,外部修改就好了,不必一个个地去修改依赖于它的类。

laravel中的依赖注入

laravel 中,经常写出下面这种代码

class SomeController {
    public function index(Request $request) {
        dd($request->all());
    }
}

只要在方法参数中申明 Request $request,就可以直接使用 $request 对象了,非常地方便。

其实laravel在背后利用PHP的反射机制为我们做了 $request = new Request 这一步。反射是一种类的反省能力,可以导出类的详细信息包括属性、方法、甚至注释等等。关于反射可以查看PHP文档http://php.net/manual/zh/intro.reflection.php

至于怎么实现,直接看代码

$method = new ReflectionMethod('SomeController', 'index');
$args = [];
foreach($method->getParameters() as $parameter) {
    if ($class = $parameter->getClass()) {
        $args[] = new $class->name; //$request = new Request
    }
}
$method->invokeArgs(new SomeController, $args);

通过 ReflectionMethod 获取类方法的参数,如果参数是其他的类,就实例化后传入到类方法中,原理就是这么简单。

篇幅不多,但是足够理解其中的原理了。

原文地址:https://www.cnblogs.com/luke44/p/laravel-dependencies-inject.html

时间: 2024-08-02 21:16:45

laravel中如何利用反射实现依赖注入的相关文章

轻松了解Spring中的控制反转和依赖注入(二)

紧接上一篇文章<轻松了解Spring中的控制反转和依赖注入>讲解了SpringIOC和DI的基本概念,这篇文章我们模拟一下SpringIOC的工作机制,使我们更加深刻的理解其中的工作. 类之间的结构图如下 以下是代码 BeanFactor接口:在Spring源码中的定义是:持有对一定数量的Bean的定义,同时每个Bean都被唯一标识的对象(类),需要实现这个接口.根据对Bean的定义,该工厂将会返回一个包含Bean定义的对象的独立实例(原型设计模式),或者单例共享(一个不错的单例设计模式,)范

SpringBug记录 -- java.lang.NullPointerException在Spring单元测试中遇到的空指针异常及依赖注入异常总结

在进行SSM整合过程中遇到了空指针异常以及依赖注入异常,分别说一下. 1.空指针异常: 在进行单元测试时,发现在Controller层出现空指针异常.然后单独测试Service层,发现空指针异常到了Service层.后来发现,原来我在Test方法中New了一个新的Service.导致空指针异常,由于Ioc机制,Spring已经自动帮我们注入了这个变量,所以重新声明的话会导致空指针异常(果然基础还是不够扎实哈哈,长记性了) 2.依赖注入失败异常. 在启动tomcat时,发现Tomcat报异常,无法

[javascript] 反射与依赖注入!

对于javascript中的反射的理解,一直都是认为,利用数组对回调函数进行保存,之后在适当的时刻利用call或是apply 方法,对回调进行调用即可,一般如下操作: 首先定义两个方法: var service = function() { return { name: 'Service' }; } var router = function() { return { name: 'Router' }; } 我们有另一个函数需要用到这两个模块. var doSomething = functio

Entity Framework 实体框架的形成之旅--利用Unity对象依赖注入优化实体框架(2)

在本系列的第一篇随笔<Entity Framework 实体框架的形成之旅--基于泛型的仓储模式的实体框架(1)>中介绍了Entity Framework 实体框架的一些基础知识,以及构建了一个简单的基于泛型的仓储模式的框架,例子也呈现了一个实体框架应用的雏形,本篇继续介绍这个主题,继续深化介绍Entity Framework 实体框架的知识,以及持续优化这个仓储模式的实体框架,主要介绍业务逻辑层的构建,以及利用Unity和反射进行动态的对象注册. 1.EDMX文件位置的调整 我们从上篇例子,

轻松了解Spring中的控制反转和依赖注入

我们回顾一下计算机的发展史,从最初第一台计算机的占地面积达170平方米,重达30吨,到现如今的个人笔记本,事物更加轻量功能却更加丰富,这是事物发展过程中的一个趋势,在技术领域中同样也是如此,企业级JavaBean(Enterprise JavaBean ,EJB)在创建之初是非常成功,但是时间一久人们便开始追逐更加方便更加简易和轻量级的技术框架实现,于是Spring就应运而生,并且Sring一直开始不断地涉及到其他领域(这里就不再多详谈了),而Spring的精髓当中就包括控制反转和依赖注入. 浅

PHP中的服务容器与依赖注入的思想

依赖注入 当A类需要依赖于B类,也就是说需要在A类中实例化B类的对象来使用时候,如果B类中的功能发生改变,也会导致A类中使用B类的地方也要跟着修改,导致A类与B类高耦合.这个时候解决方式是,A类应该去依赖B类的接口,把具体的类的实例化交给外部. 就拿我们业务中常用的通知模块来说. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 <?php /**  * 定义了一个消息类  * Class Messag

Java反射及依赖注入简单模拟

一.编写Dao类 ? 1 2 3 4 5 6 7 8 9 10 11 package cn.com.songjy.annotation; import java.util.Date; public class MyDao {     public String time(){         return "你好,现在的时间是:" + new Date();     }      } 二.编写属性文件[my.properties,类似spring的配置文件]并将MyDao类配置到其中,

反射机制、依赖注入、控制反转

反射机制 正向: 代码->dll, 先编码, 定义好类,通过实例化对象来调用之. 反向: dll->类[方法,属性]. 从已经有的dll文件反编译得到其中的一些可用的方法. 审查元数据并收集关于它的类型信息的能力.元数据(编译以后的最基本数据单元)就是一大堆的表,当编译程序集或者模块时,编译器会创建一个类定义表,一个字段定义表,和一个方法定义表等. System.reflection命名空间包含的几个类,允许你反射(解析)这些元数据表的代码. 反射是.Net中获取 运行时类型信息的方式,.Ne

JavaEE开发之Spring中的依赖注入与AOP编程

一.快速创建Mava管理的Spring工程 因为本篇博客是讨论关于Spring的东西,所以我们就不创建WebApp的工程了.我们使用Spring来快速的创建一个Maven管理的工程.如下所示找到File->New->Maven Project选项来创建一个新的Maven Project,具体如下所示: 下方我们选择创建一个简单的Maven工程,跳过模板的选择.上篇博客我们在创建Maven工程时,是没有选择下方这个选项的,然后我们选择了一个WebApp的模板.而本篇博客,我们不需要WebApp的