Laravel 依赖注入思想

前端之家收集整理的这篇文章主要介绍了Laravel 依赖注入思想前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

依赖注入

依赖注入是个花俏的名词,事实上是指:类的依赖通过构造器或在某些情况下通过「setter」方法「注入」。先看一段 Laravel 控制器里的代码实例:

  1. <?PHP
  2.  
  3. namespace App\Http\Controllers;
  4.  
  5. use Illuminate\Routing\Controller;
  6. use App\Users\Repository as UserRepository;
  7.  
  8. class UserController extends Controller
  9. {
  10. /**
  11. * 用户 Repository 的实例。
  12. */
  13. protected $users;
  14.  
  15. /**
  16. * 创建一个新的控制器实例。
  17. *
  18. * @param UserRepository $users
  19. * @return void
  20. */
  21. public function __construct(UserRepository $users)
  22. {
  23. $this->users = $users;
  24. }
  25.  
  26. /**
  27. * 显示指定 ID 的用户
  28. *
  29. * @param int $id
  30. * @return View
  31. */
  32. public function show($id)
  33. {
  34. $user_info = $this->users->find($id);
  35. return view('user',['user_info' => $user_info]);
  36. }
  37. }

Laravel 通过服务容器来管理类依赖并进行依赖注入。如果使用一个接口作为函数参数的类型提示,这个时候就需要将指定的实现绑定到接口上面:

  1. interface EventPusher {
  2. public function send($data);
  3. }
  1. class RedisEventPusher implements EventPusher {
  2. public function send($data) {
  3. //
  4. }
  5. }
  1. $this->app->bind('App\Contracts\EventPusher','App\Services\RedisEventPusher');
  1. use App\Contracts\EventPusher;
  2.  
  3. /**
  4. * 创建一个新的类实例。
  5. *
  6. * @param EventPusher $pusher
  7. * @return void
  8. */
  9. public function __construct(EventPusher $pusher)
  10. {
  11. $this->pusher = $pusher;
  12. }

这个就是所谓的面向接口编程,接口可以理解为一个规范、一个约束。高层模块不直接依赖于低层模块,它们都应该依赖于抽象(指接口)。

使用依赖注入,最重要的一点好处就是有效的分离了对象和它所需要的外部资源,使得它们松散耦合,有利于功能复用,更重要的是使得程序的整个体系结构变得非常灵活。

控制反转

控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则。其中**最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫“依赖查找”(Dependency Lookup)。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体,将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中。

  1. <?PHP
  2. /**
  3. * 没有IoC/DI的时候,常规的A类使用C类的示例
  4. */
  5.  
  6. /**
  7. * Class c
  8. */
  9. class c
  10. {
  11. public function say()
  12. {
  13. echo 'hello';
  14. }
  15. }
  16.  
  17. /**
  18. * Class a
  19. */
  20. class a
  21. {
  22. private $c;
  23. public function __construct()
  24. {
  25. $this->c = new C(); // 实例化创建C类
  26. }
  27.  
  28. public function sayC()
  29. {
  30. echo $this->c->say(); // 调用C类中的方法
  31. }
  32. }
  33.  
  34. $a = new a();
  35. $a->sayC();

当有了IoC/DI的容器后,A类不再主动去创建C了,如下图所示:

而是被动等待,等待IoC/DI的容器获取一个C的实例,然后反向的注入到A类中,如下图所示:

  1. <?PHP
  2. /**
  3. * 当有了IoC/DI的容器后,a类依赖c实例注入的示例
  4. */
  5.  
  6. /**
  7. * Class c
  8. */
  9. class c
  10. {
  11. public function say()
  12. {
  13. echo 'hello';
  14. }
  15. }
  16.  
  17. /**
  18. * Class a
  19. */
  20. class a
  21. {
  22. private $c;
  23. public function setC(C $c)
  24. {
  25. $this->c = $c; // 实例化创建C类
  26. }
  27.  
  28. public function sayC()
  29. {
  30. echo $this->c->say(); // 调用C类中的方法
  31. }
  32. }
  33.  
  34. $c = new C();
  35. $a = new a();
  36. $a->setC($c);
  37. $a->sayC();

参考链接

  1. 类型约束

  2. PHP 依赖注入,从此不再考虑加载顺序

  3. Java基础:面向对象三大特征、五大原则

  4. 依赖倒置原则

  5. PHP程序员如何理解依赖注入容器(dependency injection container)

  6. 聊一聊PHP的依赖注入(DI) 和 控制反转(IoC)

  7. 深入探討依賴注入

  8. 服务容器

猜你在找的设计模式相关文章