详解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 相关文章推荐
基于PHPExcel的常用方法总结
Jun 13 PHP
浅析Apache中RewriteCond规则参数的详细介绍
Jun 30 PHP
php遍历目录与文件夹的多种方法详解
Nov 14 PHP
PHP源码分析之变量的存储过程分解
Jul 03 PHP
php学习笔记之面向对象
Nov 08 PHP
php实现session自定义会话处理器的方法
Jan 27 PHP
thinkphp如何获取客户端IP
Nov 03 PHP
php json中文编码为null的解决办法
Dec 14 PHP
PHP实现链式操作的三种方法详解
Nov 16 PHP
PHP 二维array转换json的实例讲解
Aug 21 PHP
laravel实现按时间日期进行分组统计方法示例
Mar 23 PHP
ThinkPHP5.0框架实现切换数据库的方法分析
Oct 30 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令牌 Token改进版
2008/07/18 PHP
php实现文件下载功能的几个代码分享
2014/05/10 PHP
PHP自定义错误用法示例
2016/09/28 PHP
PHP使用正则表达式实现过滤非法字符串功能示例
2018/06/04 PHP
JAVASCRIPT HashTable
2007/01/22 Javascript
地震发生中逃生十大法则
2008/05/12 Javascript
javascript 常用代码技巧大收集
2009/02/25 Javascript
javascript重写alert方法的实例代码
2013/03/29 Javascript
纯js和css完成贪吃蛇小游戏demo
2016/09/01 Javascript
javascript淘宝主图放大镜功能
2016/10/20 Javascript
jQuery图片切换动画特效
2016/11/02 Javascript
jQuery实现验证码功能
2017/03/17 Javascript
javascript数组去重常用方法实例分析
2017/04/11 Javascript
axios post提交formdata的实例
2018/03/16 Javascript
基于Bootstrap下拉框插件bootstrap-select使用方法详解
2018/08/07 Javascript
使用vue实现各类弹出框组件
2019/07/03 Javascript
100行代码实现vue表单校验功能(小白自编)
2019/11/19 Javascript
[02:03]完美世界DOTA2联赛10月30日赛事集锦
2020/10/31 DOTA
详解Python中类的定义与使用
2017/04/11 Python
python中安装模块包版本冲突问题的解决
2017/05/02 Python
Django框架实现逆向解析url的方法
2018/07/04 Python
Python Web程序搭建简单的Web服务器
2019/07/31 Python
Python爬虫程序架构和运行流程原理解析
2020/03/09 Python
PyCharm2020.1.2社区版安装,配置及使用教程详解(Windows)
2020/08/07 Python
JD Sports德国官网:英国领先的运动鞋和运动服饰零售商
2018/02/26 全球购物
某公司部分笔试题
2013/11/05 面试题
毕业生自荐信的主要内容
2013/10/29 职场文书
师范生的个人求职信范文
2014/01/04 职场文书
水利学院求职自荐书
2014/02/01 职场文书
电气自动化专业职业规划范文
2014/02/16 职场文书
大学生求职意向书
2015/05/11 职场文书
旗帜观后感
2015/06/08 职场文书
2015国庆节宣传语
2015/07/14 职场文书
导游词之珠海轮廓
2019/10/25 职场文书
话题作文之成长
2019/12/09 职场文书
CSS3 菱形拼图实现只旋转div 背景图片不旋转功能
2021/03/30 HTML / CSS