从根本上说,依赖注入不是让对象创建一个依赖关系,也不是让工厂对象去创建对象,而是将所需的依赖变成一个外部对象,使之成为一个”某些人的问题”
你为”某些人的问题”注入了类的依赖关系。在laravel中,这个”某人”是服务容器。在laravel中,服务容器负责通过构造函数注入类的依赖关系。
任何时候,你在一个控制器类中请求一个依赖,这个服务容器负责:
自动地在构造函数中检测依赖关系如果需要构建这个依赖关系通过构造函数创建对象形成依赖关系来看一个非常简单的例子。
1 <?php 2 namespace app\http\controllers; 3 u app\ur; 4 u app\repositories\urrepository; 5 u app\http\controllers\controller; 6 class urcontroller extends controller 7 { 8 protected $ur数学速算repository; 9 public function __construct(urrepository $urrepository)10 {11 $this->urrepository = $urrepository;12 }13 public function show($id)14 {15 $ur = $this->urrepository->find($id);16 return view('ur.profile', ['ur' => $ur]);17 }18 }
假如,你有一个urcontroller
夸赞类需要urrepository
作为一个构造函数依赖。
php
的反射类来检测,事实urrepository
需要被优先解析。然后,它构造urrepository
实例。然后,它构造urcontroller
类实例。依赖关系是如何被解析和注入的,我被很多laravel
开发人员不知道这个简单而强大的技术感到迷惑。 这是一个非常强大的技术,它可以被用来解决复杂对象的依赖关系。
如果由于某种原因,您不希望laravel自动构建一个对象,您还可以通过传递一个可用于创建依赖关系的回调来告诉laravel rvice container如何构造该对象。
1 <?php2 $container->bind('my\rvice', function($c镇江市高等专科学校ontainer) {3 return new my\rvice($container->make('my\anotherrvice'));4 });
您需要创建一个服务提供商来注册上述服务。
1 <?php 2 namespace app\providers; 3 u illuminate\support\rviceprovider; 4 class myrviceprovider extends rviceprovider 5 { 6 public function register() 7 { 8 $this->app->singleton(\my\rvice::class, function ($app) { 9 return new \my\rvice($app->make('my\anotherrvice'));10 });11 }12 }
当my\rvice
需要被解析的时候,负责返回一个对象的回调函数就会被调用。
1 <?php 2 namespace app\http\controllers; 3 u app\ur; 4 u app\http\controllers\controller; 5 class mycontroller extends controller 6 { 7 protected $myrvice; 8 public function __construct(\my\rvice $myrvice) 9 {10 $this->myrvice = $myrvice;11 }12 // .. 方法13 }
假设你的应用需要facebook的php sdk来访问facebook的api,你的控制器就是这样的:
1 <?php 2 namespace app\http\controllers; 3 u app\ur; 4 u app\http\controllers\controller; 5 u facebook\facebook; 6 class facebookapiaccesscontroller extends controller 7 { 8 protected $facebook; 9 public function __construct(facebook\facebook $facebook)10 {11 $this->facebook = $facebook;12 }13 //.. action methods here14 }
现在,您需要告诉rvice container如何构建facebook\facebook
的实例.
1 <?php2 $container->singleton('facebook\facebook', function() {3 return new \facebook\facebook([4 'app_id' => config('rvices.facebook.app_id'),5 'app_cret' =&gusuallyt; config('rvices.facebook.app_cret'),6 'default_graph_version' => 'v2.10',7 ]);8 });
注意,我已经调用了方法singleton
而不是bind
。 唯一的区别是用singleton
注册的服务被缓存,随后的解析服务调用返回缓存的服务英文演讲。
依赖注入是一种强大的技术,你可以在laravel
中用来简化对象的创建. 默认情况下,laravel
的服务容器会自动的用反射去检测和解决依赖关系. 但是, 你可以指定回调来解析服务.
本文发布于:2023-04-07 20:02:18,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/0a86f0cc353b9c71435e2ee0767bf200.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:PHP 从另一个角度来分析 Laravel 框架的依赖注入功能.doc
本文 PDF 下载地址:PHP 从另一个角度来分析 Laravel 框架的依赖注入功能.pdf
留言与评论(共有 0 条评论) |