详解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 相关文章推荐
基于mysql的bbs设计(四)
Oct 09 PHP
PHP 日常开发小技巧
Sep 23 PHP
编写php应用程序实现摘要式身份验证的方法详解
Jun 08 PHP
基于php常用函数总结(数组,字符串,时间,文件操作)
Jun 27 PHP
php多用户读写文件冲突的解决办法
Nov 06 PHP
PHP异常Parse error: syntax error, unexpected T_VAR错误解决方法
May 06 PHP
php ImageMagick windows下安装教程
Jan 26 PHP
PHP使用array_fill定义多维数组的方法
Mar 18 PHP
简单介绍win7下搭建apache+php+mysql开发环境
Aug 06 PHP
php实现的pdo公共类定义与用法示例
Jul 19 PHP
PHP实现的mysql主从数据库状态检测功能示例
Jul 20 PHP
php实现的mongoDB单例模式操作类
Jan 20 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站内搜索并高亮显示关键字的实现代码
2011/12/29 PHP
克隆一个新项目的快捷方式
2013/04/10 PHP
深入php socket的讲解与实例分析
2013/06/13 PHP
PHP中对数组的一些常用的增、删、插操作函数总结
2015/11/27 PHP
PHP数组中头部和尾部添加元素的方法(array_unshift,array_push)
2017/04/10 PHP
用JavaScript隐藏控件的方法
2009/09/21 Javascript
jquery关于图形报表的运用实现代码
2011/01/06 Javascript
jquery中防刷IP流量软件影响统计的一点对策
2011/07/10 Javascript
jquery attr 设定src中含有&amp;(宏)符号问题的解决方法
2011/07/26 Javascript
不使用浏览器运行javascript代码的方法
2013/07/24 Javascript
Javascript事件实例详解
2013/11/06 Javascript
JS中类或对象的定义说明
2014/03/10 Javascript
手机号码,密码正则验证
2014/09/04 Javascript
用js实现放大镜的效果的简单实例
2016/05/23 Javascript
JS实现动态倒计时功能(天数、时、分、秒)
2019/12/12 Javascript
vue项目实现图片上传功能
2019/12/23 Javascript
pymssql ntext字段调用问题解决方法
2008/12/17 Python
python插入排序算法实例分析
2015/07/03 Python
星球大战与Python之间的那些事
2016/01/07 Python
Django使用paginator插件实现翻页功能的实例
2018/10/24 Python
Pycharm 实现下一个文件引用另外一个文件的方法
2019/01/17 Python
Django框架封装外部函数示例
2019/05/28 Python
Python字典中的值为列表或字典的构造实例
2019/12/16 Python
python GUI库图形界面开发之PyQt5下拉列表框控件QComboBox详细使用方法与实例
2020/02/27 Python
Django ModelForm组件原理及用法详解
2020/10/12 Python
python3访问字典里的值实例方法
2020/11/18 Python
英国建筑用品在线:Building Supplies Online(BSO)
2018/04/30 全球购物
计算机网络毕业生自荐信
2013/10/01 职场文书
业务员岗位职责
2013/11/16 职场文书
生产厂长岗位职责
2014/02/21 职场文书
创建文明学校实施方案
2014/03/11 职场文书
消防志愿者活动方案
2014/08/23 职场文书
厨师长岗位职责范本
2014/08/25 职场文书
学校通报表扬范文
2015/05/04 职场文书
党组织关系的介绍信模板
2019/06/21 职场文书
oracle通过存储过程上传list保存功能
2021/05/12 Oracle