PHP 从另一个角度来分析 Laravel 框架的依赖注入功能
从根本上说,依赖注入不是让对象创建一个依赖关系,也不是让工厂对象去创建对象,而是将所需的依赖变成一个外部对象,使之成为一个"某些人的问题” 你为"某些人的问题”注入了类的依赖关系。在Laravel中,这个"某人”是服务容器。在Laravel中,服务容器负责通过构造函数注入类的依赖关系。 任何时候,你在一个控制器类中请求一个依赖,这个服务容器负责:
来看一个非常简单的例子。 1 <?php
2 namespace AppHttpControllers;
3 use AppUser;
4 use AppRepositoriesUserRepository;
5 use AppHttpControllersController;
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 }
假如,你有一个
依赖关系是如何被解析和注入的,我被很多 如果由于某种原因,您不希望Laravel自动构建一个对象,您还可以通过传递一个可用于创建依赖关系的回调来告诉Laravel Service Container如何构造该对象。 1 <?php
2 $container->bind('MyService',function($container) {
3 return new MyService($container->make('MyAnotherService'));
4 });
您需要创建一个服务提供商来注册上述服务。 1 <?php
2 namespace AppProviders;
3 use IlluminateSupportServiceProvider;
4 class MyServiceProvider extends ServiceProvider
5 {
6 public function register()
7 {
8 $this->app->singleton(MyService::class,function ($app) {
9 return new MyService($app->make('MyAnotherService'));
10 });
11 }
12 }
当 1 <?php
2 namespace AppHttpControllers;
3 use AppUser;
4 use AppHttpControllersController;
5 class MyController extends Controller
6 {
7 protected $myService;
8 public function __construct(MyService $myService)
9 {
10 $this->myService = $myService;
11 }
12 // .. 方法
13 }
真实的例子假设你的应用需要Facebook的PHP SDK来访问Facebook的API,你的控制器就是这样的: 1 <?php
2 namespace AppHttpControllers;
3 use AppUser;
4 use AppHttpControllersController;
5 use FacebookFacebook;
6 class FacebookApiAccessController extends Controller
7 {
8 protected $facebook;
9 public function __construct(FacebookFacebook $facebook)
10 {
11 $this->facebook = $facebook;
12 }
13 //.. action methods here
14 }
现在,您需要告诉Service Container如何构建 1 <?php
2 $container->singleton('FacebookFacebook',function() {
3 return new FacebookFacebook([
4 'app_id' => config('services.facebook.app_id'),5 'app_secret' => config('services.facebook.app_secret'),6 'default_graph_version' => 'v2.10',7 ]);
8 });
注意,我已经调用了方法 结论依赖注入是一种强大的技术,你可以在 phper在进阶的时候总会遇到一些问题和瓶颈,业务代码写多了没有方向感,不知道该从那里入手去提升,对此我整理了一些资料,包括但不限于:分布式架构、高可扩展、高性能、高并发、服务器性能调优、TP6,laravel,YII2,Redis,Swoole、Kafka、Mysql优化、shell脚本、Docker、微服务、Nginx等多个知识点高级进阶干货需要的可以免费分享给大家,需要的(点击→)我的官方群677079770 (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
