从根本上说,依赖注入不是让对象创建一个依赖关系,也不是让工厂对象去创建对象,而是将所需的依赖变成一个外部对象,使之成为一个"某些人的问题”
你为"某些人的问题”注入了类的依赖关系。在Laravel中,这个"某人”是 服务容器 。在Laravel中,服务容器负责通过构造函数注入类的依赖关系。
任何时候,你在一个控制器类中请求一个依赖,这个服务容器负责:
自动地在构造函数中检测依赖关系如果需要构建这个依赖关系通过构造函数创建对象形成依赖关系来看一个非常简单的例子。
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 { 8 protected $userRepository; 9 public function __construct(UserRepository $userRepository)10 {11 $this->userRepository = $userRepository;12 }13 public function show($ID)14 {15 $user = $this->userRepository->find($ID);16 return vIEw('user.profile',['user' => $user]);17 }18 }
假如,你有一个 UserController
类需要 UserRepository
作为一个构造函数依赖。
PHP
的 反射类 来检测,事实 UserRepository
需要被优先解析。然后,它构造 UserRepository
实例。然后,它构造 UserController
类实例。依赖关系是如何被解析和注入的,我被很多 Laravel
开发人员不知道这个简单而强大的技术感到迷惑。 这是一个非常强大的技术,它可以被用来解决复杂对象的依赖关系。
如果由于某种原因,您不希望Laravel自动构建一个对象,您还可以通过传递一个可用于创建依赖关系的回调来告诉Laravel Service Container如何构造该对象。
1 <?PHP2 $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 { 6 public function register() 7 { 8 $this->app->singleton(\My\Service::class,function ($app) { 9 return new \My\Service($app->make('My\AnotherService'));10 });11 }12 }
当 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 { 7 protected $myService; 8 public function __construct(\My\Service $myService) 9 {10 $this->myService = $myService;11 }12 // .. 方法13 }
真实的例子
假设你的应用需要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 { 8 protected $facebook; 9 public function __construct(Facebook\Facebook $facebook)10 {11 $this->facebook = $facebook;12 }13 //.. action methods here14 }
现在,您需要告诉Service Container如何构建 Facebook\Facebook
的实例.
1 <?PHP2 $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
的服务容器会自动的用反射去检测和解决依赖关系. 但是,你可以指定回调来解析服务.
PHPer在进阶的时候总会遇到一些问题和瓶颈,业务代码写多了没有方向感,不知道该从那里入手去提升,对此我整理了一些资料,包括但不限于:分布式架构、高可扩展、高性能、高并发、服务器性能调优、TP6,laravel,YII2,Redis,Swoole、Kafka、MysqL优化、shell脚本、Docker、微服务、Nginx等多个知识点高级进阶干货需要的可以免费分享给大家,需要的(点击→)我的官方群677079770
总结以上是内存溢出为你收集整理的PHP 从另一个角度来分析 Laravel 框架的依赖注入功能全部内容,希望文章能够帮你解决PHP 从另一个角度来分析 Laravel 框架的依赖注入功能所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)