详解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 图片上传代码
Sep 13 PHP
PHP数据集构建JSON格式及新数组的方法
Nov 07 PHP
PHP gbk环境下json_dencode传送来的汉字
Nov 13 PHP
奉献出一个封装的curl函数 便于调用(抓数据专用)
Jul 22 PHP
php获取客户端电脑屏幕参数的方法
Jan 09 PHP
php判断访问IP的方法
Jun 19 PHP
twig模板常用语句实例小结
Feb 04 PHP
Yii2.0中的COOKIE和SESSION用法
Aug 12 PHP
php 开发中加密的几种方法总结
Mar 22 PHP
PHP实现的注册,登录及查询用户资料功能API接口示例
Jun 06 PHP
PHP+AJAX 投票器功能
Nov 11 PHP
php实现微信公众号创建自定义菜单功能的实例代码
Jun 11 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输出不同的心形图案
2016/04/22 PHP
laravel中Redis队列监听中断的分析
2020/09/14 PHP
打造基于jQuery的高性能TreeView(asp.net)
2011/02/23 Javascript
弹出层之1:JQuery.Boxy (一) 使用介绍
2011/10/06 Javascript
IE中的File域无法清空使用jQuery重设File域
2014/04/24 Javascript
node.js中的fs.lstatSync方法使用说明
2014/12/16 Javascript
JavaScript学习笔记之JS事件对象
2015/01/22 Javascript
js调出上下文菜单的实例
2015/12/17 Javascript
jQuery插件实现适用于移动端的地址选择器
2016/02/18 Javascript
Bootstrap源码解读导航(6)
2016/12/23 Javascript
Vue学习笔记进阶篇之过渡状态详解
2017/07/14 Javascript
ES6下子组件调用父组件的方法(推荐)
2018/02/23 Javascript
快速解决brew安装特定版本flow的问题
2018/05/17 Javascript
详解vue中axios请求的封装
2019/04/08 Javascript
Vue-input框checkbox强制刷新问题
2019/04/18 Javascript
layui清除radio的选中状态实例
2019/11/14 Javascript
微信小程序动态添加和删除组件的现实
2020/02/28 Javascript
微信小程序实现翻牌抽奖动画
2020/09/21 Javascript
vue实现简易计算器功能
2021/01/20 Vue.js
[45:25]完美世界DOTA2联赛循环赛 PXG vs IO 第一场 11.06
2020/11/09 DOTA
[01:11]steam端dota2实名认证操作流程视频
2021/03/11 DOTA
python装饰器与递归算法详解
2016/02/18 Python
python实现csv格式文件转为asc格式文件的方法
2018/03/23 Python
python设计tcp数据包协议类的例子
2019/07/23 Python
python、PyTorch图像读取与numpy转换实例
2020/01/13 Python
Django跨域资源共享问题(推荐)
2020/03/09 Python
HTMl5的存储方式sessionStorage和localStorage详解
2014/03/18 HTML / CSS
美国知名运动产品零售商:Foot Locker
2016/07/23 全球购物
叙述DBMS对数据控制功能有哪些
2016/06/12 面试题
铲车司机岗位职责
2014/03/15 职场文书
工作会议方案
2014/05/21 职场文书
2014年电信员工工作总结
2014/12/19 职场文书
2015年公司后勤管理工作总结
2015/05/13 职场文书
python3操作redis实现List列表实例
2021/08/04 Python
python 闭包函数详细介绍
2022/04/19 Python
Golang 实现 WebSockets 之创建 WebSockets
2022/04/24 Golang