当前位置:首页 > CMS教程 > 其它CMS > 列表

详解Laravel框架的依赖注入功能

发布:smiling 来源: PHP粉丝网  添加日期:2022-04-29 08:48:56 浏览: 评论:0 

依赖注入不是让对象创建一个依赖关系,也不是让工厂对象去创建对象,而是将所需的依赖变成一个外部对象,使之成为一个"某些人的问题”,你为"某些人的问题”注入了类的依赖关系。在Laravel中,这个"某人”是服务容器,服务容器负责通过构造函数注入类的依赖关系。

概述

任何时候,你在一个控制器类中请求一个依赖,这个服务容器负责:

1.自动地在构造函数中检测依赖关系

2.如果需要构建这个依赖关系

3.通过构造函数创建对象形成依赖关系

来看一个非常简单的例子。

  1. <?php 
  2. namespace App\Http\Controllers; 
  3. use App\User; 
  4. use App\Repositories\UserRepository; 
  5. use App\Http\Controllers\Controller; 
  6. class UserController extends Controller 
  7.     protected $userRepository
  8.     public function __construct(UserRepository $userRepository
  9.     { 
  10.         $this->userRepository = $userRepository
  11.     } 
  12.     public function show($id
  13.     { 
  14.         $user = $this->userRepository->find($id); 
  15.         return view('user.profile', ['user' => $user]); 
  16.     } 

假如,你有一个UserController类需要UserRepository作为一个构造函数依赖。

1.服务容器使用PHP的反射类来检测,事实UserRepository需要被优先解析。

2.然后,它构造UserRepository实例。

3.然后,它构造UserController类实例。

依赖关系是如何被解析和注入的,我被很多Laravel开发人员不知道这个简单而强大的技术感到迷惑。 这是一个非常强大的技术,它可以被用来解决复杂对象的依赖关系。

如果由于某种原因,您不希望Laravel自动构建一个对象,您还可以通过传递一个可用于创建依赖关系的回调来告诉Laravel Service Container如何构造该对象。

  1. <?php 
  2. $container->bind('My\Service'function($container) { 
  3. return new My\Service($container->make('My\AnotherService')); 
  4. }); 

您需要创建一个服务提供商来注册上述服务。

  1. <?php 
  2. namespace App\Providers; 
  3. use Illuminate\Support\ServiceProvider; 
  4. class MyServiceProvider extends ServiceProvider 
  5.     public function register() 
  6.     { 
  7.         $this->app->singleton(\My\Service::classfunction ($app) { 
  8.             return new \My\Service($app->make('My\AnotherService')); 
  9.         }); 
  10.     } 

当My\Service需要被解析的时候,负责返回一个对象的回调函数就会被调用。

  1. <?php 
  2. namespace App\Http\Controllers; 
  3. use App\User; 
  4. use App\Http\Controllers\Controller; 
  5. class MyController extends Controller 
  6.     protected $myService
  7.     public function __construct(\My\Service $myService
  8.     { 
  9.         $this->myService = $myService
  10.     } 
  11.     // .. 方法 

真实的例子

假设你的应用需要Facebook的PHP SDK来访问Facebook的API,你的控制器就是这样的:

  1. <?php 
  2. namespace App\Http\Controllers; 
  3. use App\User; 
  4. use App\Http\Controllers\Controller; 
  5. use Facebook\Facebook; 
  6. class FacebookApiAccessController extends Controller 
  7.     protected $facebook
  8.     public function __construct(Facebook\Facebook $facebook
  9.     { 
  10.         $this->facebook = $facebook
  11.     } 
  12.     //.. action methods here 

现在,您需要告诉Service Container如何构建Facebook\Facebook的实例.

  1. <?php 
  2. $container->singleton('Facebook\Facebook'function() { 
  3.   return new \Facebook\Facebook([ 
  4.     'app_id' => config('services.facebook.app_id'), 
  5.     'app_secret' => config('services.facebook.app_secret'), 
  6.     'default_graph_version' => 'v2.10'
  7.   ]); 
  8. }); 

注意,我已经调用了方法singleton而不是bind,唯一的区别是用singleton注册的服务被缓存,随后的解析服务调用返回缓存的服务。

结论:

依赖注入是一种强大的技术,你可以在Laravel中用来简化对象的创建. 默认情况下,Laravel的服务容器会自动的用反射去检测和解决依赖关系. 但是, 你可以指定回调来解析服务.

Tags: Laravel依赖注入

分享到: