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

吾爱主题 阅读:145 2021-11-16 16:04:00 评论:0
目录
  • 概述
  • 真实的例子
  • 结论

概述

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

真实的例子

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

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

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

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

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

结论

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

以上就是详解Laravel框架的依赖注入功能的详细内容,更多关于Laravel框架的依赖注入功能的资料请关注服务器之家其它相关文章!

原文链接:https://www.cnblogs.com/a609251438/p/11801070.html

可以去百度分享获取分享代码输入这里。
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

【腾讯云】云服务器产品特惠热卖中
搜索
标签列表
    关注我们

    了解等多精彩内容