详解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 相关文章推荐
通过对服务器端特性的配置加强php的安全
Oct 09 PHP
php数组函数序列之array_search()- 按元素值返回键名
Nov 04 PHP
PHP APC缓存配置、使用详解
Mar 06 PHP
PHP扩展CURL的用法详解
Jun 20 PHP
VB中的RasEnumConnections函数返回632错误解决方法
Jul 29 PHP
PHP、Java des加密解密实例
Apr 27 PHP
thinkphp3.x中display方法及show方法的用法实例
May 19 PHP
PHP设计模式之工厂模式定义与用法详解
Apr 03 PHP
PHP5.0~5.6 各版本兼容性cURL文件上传功能实例分析
May 11 PHP
PHP等比例压缩图片的实例代码
Jul 26 PHP
Centos7 Yum安装PHP7.2流程教程详解
Jul 02 PHP
php实现QQ小程序发送模板消息功能
Sep 18 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
整合了前面的PHP数据库连接类~~做成一个分页类!
2006/11/25 PHP
详解PHP错误日志的获取方法
2015/07/20 PHP
如何解决PHP无法实现多线程的问题
2015/09/25 PHP
PHP图片加水印实现方法
2016/05/06 PHP
kindeditor 加入七牛云上传的实例讲解
2017/11/12 PHP
PHP设计模式之装饰器模式实例详解
2018/02/07 PHP
兼容IE和FF的js脚本代码小结(比较常用)
2010/12/06 Javascript
IE下JS读取xml文件示例代码
2013/08/05 Javascript
js 获取元素下面所有li的两种方法
2014/04/14 Javascript
jQuery实现的指纹扫描效果实例(附演示与demo源码下载)
2016/01/26 Javascript
浅谈基于Vue.js的移动组件库cube-ui
2017/12/20 Javascript
js实现通过开始结束控制的计时器
2019/02/25 Javascript
对layer弹出框中icon数字参数的说明介绍
2019/09/04 Javascript
JS控制下拉列表左右选择实例代码
2020/05/08 Javascript
Python+Pika+RabbitMQ环境部署及实现工作队列的实例教程
2016/06/29 Python
基于python的Tkinter编写登陆注册界面
2017/06/30 Python
Python中函数及默认参数的定义与调用操作实例分析
2017/07/25 Python
python增加矩阵维度的实例讲解
2018/04/04 Python
PyCharm安装第三方库如Requests的图文教程
2018/05/18 Python
详解python算法之冒泡排序
2019/03/05 Python
Python list与NumPy array 区分详解
2019/11/06 Python
Ubuntu16.04安装python3.6.5步骤详解
2020/01/10 Python
使用Python 自动生成 Word 文档的教程
2020/02/13 Python
python 操作excel表格的方法
2020/12/05 Python
英国在线房屋中介网站:Yopa
2018/01/09 全球购物
Ted Baker美国官网:英国时尚品牌
2018/10/29 全球购物
考博专家推荐信模板
2013/12/02 职场文书
公司管理建议书范文
2014/03/12 职场文书
激励口号大全
2014/06/17 职场文书
大学新生军训自我鉴定范文
2014/09/13 职场文书
2014机关干部学习“焦裕禄精神”思想汇报
2014/09/19 职场文书
2014年大学班长工作总结
2014/11/14 职场文书
独生子女证明范本
2015/06/19 职场文书
2016猴年开门红标语口号
2015/12/26 职场文书
python实现A*寻路算法
2021/06/13 Python
python​格式化字符串
2022/04/20 Python