详解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设计模式 FlyWeight (享元模式)
Jun 26 PHP
ThinkPHP写第一个模块应用
Feb 20 PHP
PHP命名空间(Namespace)的使用详解
May 04 PHP
php防止伪造数据从地址栏URL提交的方法
Aug 24 PHP
php之curl实现http与https请求的方法
Oct 21 PHP
ThinkPHP安装和设置
Jul 27 PHP
详解PHP中instanceof关键字及instanceof关键字有什么作用
Nov 05 PHP
yii2控制器Controller Ajax操作示例
Jul 23 PHP
PHP编程快速实现数组去重的方法详解
Jul 22 PHP
php中html_entity_decode实现HTML实体转义
Jun 13 PHP
实例讲解PHP表单
Jun 10 PHP
PHP7移除的扩展和SAPI
Mar 09 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 模拟GMAIL,HOTMAIL(MSN),YAHOO,163,126邮箱登录的详细介绍
2013/06/18 PHP
PHP中使用register_shutdown_function函数截获fatal error示例
2015/04/21 PHP
PHP错误处理函数
2016/04/03 PHP
php字符串操作常见问题小结
2016/10/11 PHP
使用PHP+Redis实现延迟任务,实现自动取消订单功能
2019/11/21 PHP
javascript multibox 全选
2009/03/22 Javascript
JS获取月的最后一天与JS得到一个月份最大天数的实例代码
2013/12/16 Javascript
IE、FF浏览器下修改标签透明度
2014/01/28 Javascript
什么是MEAN?JavaScript编程中的MEAN是什么意思?
2014/12/18 Javascript
Jquery为DIV添加click事件的简单实例
2016/06/02 Javascript
又一枚精彩的弹幕效果jQuery实现
2016/07/25 Javascript
详解Javascript ES6中的箭头函数(Arrow Functions)
2016/08/24 Javascript
解决Angular.Js与Django标签冲突的方案
2016/12/20 Javascript
原生js实现鼠标跟随效果
2017/02/28 Javascript
bootstrap+jQuery 实现下拉菜单中复选框全选和全不选效果
2017/06/12 jQuery
原生JS实现Ajax跨域请求flask响应内容
2017/10/24 Javascript
JS实现的3des+base64加密解密算法完整示例
2018/05/18 Javascript
在vue中使用Echarts画曲线图的示例
2020/10/03 Javascript
[01:16:37]【全国守擂赛】第三周决赛 Dark Knight vs. 一个弱队
2020/05/04 DOTA
Python XML RPC服务器端和客户端实例
2014/11/22 Python
Python解析json之ValueError: Expecting property name enclosed in double quotes: line 1 column 2(char 1)
2017/07/06 Python
便捷提取python导入包的属性方法
2018/10/15 Python
浅谈Pandas Series 和 Numpy array中的相同点
2019/06/28 Python
Python定时任务随机时间执行的实现方法
2019/08/14 Python
关于pytorch中网络loss传播和参数更新的理解
2019/08/20 Python
Python 进程操作之进程间通过队列共享数据,队列Queue简单示例
2019/10/11 Python
python加载自定义词典实例
2019/12/06 Python
matlab灰度图像调整及imadjust函数的用法详解
2020/02/27 Python
G-Form护具官方网站:美国运动保护装备
2019/09/04 全球购物
Oral-B荷兰:牙医最推荐的品牌
2020/02/25 全球购物
新生开学寄语大全
2015/05/28 职场文书
2015秋季运动会通讯稿
2015/07/18 职场文书
如何书写授权委托书?
2019/06/25 职场文书
JavaScript 防篡改对象的用法示例
2021/04/24 Javascript
Java数据结构之链表相关知识总结
2021/06/18 Java/Android
Python+Tkinter制作专属图形化界面
2022/04/01 Python