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


Posted in PHP onMay 27, 2021

概述

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

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

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

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

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

<?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如何构造该对象。

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

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

<?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需要被解析的时候,负责返回一个对象的回调函数就会被调用。

<?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,你的控制器就是这样的:

<?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的实例.

<?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框架的依赖注入功能的资料请关注三水点靠木其它相关文章!

PHP 相关文章推荐
SMARTY学习手记
Jan 04 PHP
php中时间轴开发(刚刚、5分钟前、昨天10:23等)
Oct 03 PHP
将时间以距今多久的形式表示,PHP,js双版本
Sep 25 PHP
php像数组一样存取和修改字符串字符
Mar 21 PHP
PHP中加密解密函数与DES加密解密实例
Oct 17 PHP
两个php日期控制类实例
Dec 09 PHP
php输出xml属性的方法
Mar 19 PHP
php递归遍历删除文件的方法
Apr 17 PHP
PHP获得数组交集与差集的方法
Jun 10 PHP
composer.lock文件的作用
Feb 03 PHP
深入研究PHP中的preg_replace和代码执行
Aug 15 PHP
php连接mysql之mysql_connect()与mysqli_connect()的区别
Jul 19 PHP
详解PHP Swoole与TCP三次握手
May 27 #PHP
如何用PHP实现分布算法之一致性哈希算法
如何用PHP实现多线程编程
May 26 #PHP
如何用PHP websocket实现网页实时聊天
详解PHP用mb_string处理windows中文字符
May 26 #PHP
详解PHP服务器如何在有限的资源里最大提升并发能力
详解PHP设计模式之依赖注入模式
You might like
第十二节 类的自动加载 [12]
2006/10/09 PHP
ThinkPHP自定义Redis处理SESSION的实现方法
2016/05/16 PHP
PHP命名空间namespace用法实例分析
2016/09/27 PHP
thinkPHP js文件中U方法不被解析问题的解决方法
2016/12/05 PHP
EXT中xtype的含义分析
2010/01/07 Javascript
同时使用n个window onload加载实例介绍
2013/04/25 Javascript
jquery 检测元素是否存在的实例代码
2013/11/19 Javascript
html的DOM中Event对象onblur事件用法实例
2015/01/21 Javascript
详解JavaScript中getFullYear()方法的使用
2015/06/10 Javascript
JS在Chrome浏览器中showModalDialog函数返回值为undefined的解决方法
2016/08/03 Javascript
Bootstrap图片轮播组件Carousel使用方法详解
2016/10/20 Javascript
js实现1,2,3,5数字按照概率生成
2017/09/12 Javascript
Vue EventBus自定义组件事件传递
2018/06/25 Javascript
vue.js使用v-if实现显示与隐藏功能示例
2018/07/06 Javascript
详解npm 配置项registry修改为淘宝镜像
2018/09/07 Javascript
webpack打包nodejs项目的方法
2018/09/26 NodeJs
使用wxapp-img-loader自定义组件实现微信小程序图片预加载功能
2018/10/18 Javascript
Vue中使用方法、计算属性或观察者的方法实例详解
2018/10/31 Javascript
JS实现的全选、全不选及反选功能【案例】
2019/02/19 Javascript
关于Vue源码vm.$watch()内部原理详解
2019/04/26 Javascript
Vue.js递归组件实现组织架构树和选人功能案例分析
2019/07/03 Javascript
[46:48]DOTA2上海特级锦标赛A组小组赛#2 Secret VS CDEC第三局
2016/02/25 DOTA
浅析Python中return和finally共同挖的坑
2017/08/18 Python
python pandas中DataFrame类型数据操作函数的方法
2018/04/08 Python
python re模块的高级用法详解
2018/06/06 Python
django 微信网页授权认证api的步骤详解
2019/07/30 Python
python3 常见解密加密算法实例分析【base64、MD5等】
2019/12/19 Python
tensorflow 保存模型和取出中间权重例子
2020/01/24 Python
HTML5 MiranaVideo播放器 (代码开源)
2010/06/11 HTML / CSS
意大利在线高尔夫商店:Online Golf
2021/03/09 全球购物
目标管理责任书
2014/04/15 职场文书
反四风个人对照检查材料
2014/09/26 职场文书
会计工作能力自我评价
2015/03/05 职场文书
2015年秋学期师德师风建设工作总结
2015/10/23 职场文书
导游词书写之黄山
2019/08/06 职场文书
Mysql外键约束的创建与删除的使用
2022/03/03 MySQL