详解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编程中字符串处理的5个技巧小结
Nov 13 PHP
phpmyadmin 3.4 空密码登录的实现方法
May 29 PHP
MySQL时间字段究竟使用INT还是DateTime的说明
Feb 27 PHP
php按字符无乱码截取中文的方法
Mar 27 PHP
PHP弹出对话框技巧详细解读
Sep 26 PHP
对比分析php中Cookie与Session的异同
Feb 19 PHP
PHP读取大文件的多种方法介绍
Apr 04 PHP
thinkPHP分页功能实例详解
May 05 PHP
详解PHP swoole process的使用方法
Aug 26 PHP
PHP基于PDO扩展操作mysql数据库示例
Dec 24 PHP
TP5框架请求响应参数实例分析
Oct 17 PHP
PHP使用QR Code生成二维码实例
Jul 07 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 EOT定界符的使用详解
2008/09/30 PHP
PHP 验证身份证是否合法的函数
2017/02/09 PHP
PHP读取、解析eml文件及生成网页的方法示例
2017/09/04 PHP
php桥接模式应用案例分析
2019/10/23 PHP
laravel框架中控制器的创建和使用方法分析
2019/11/23 PHP
10个新的最有前途的JavaScript框架
2009/03/12 Javascript
High Performance JavaScript(高性能JavaScript)读书笔记分析
2011/05/05 Javascript
jquery.idTabs 选项卡使用示例代码
2014/09/03 Javascript
AngularJS基础知识
2014/12/21 Javascript
jqTransform美化表单
2015/10/10 Javascript
JS作用域闭包、预解释和this关键字综合实例解析
2016/12/16 Javascript
全面解析vue中的数据双向绑定
2017/05/10 Javascript
vue指令之表单控件绑定v-model v-model与v-bind结合使用
2019/04/17 Javascript
Vue数据双向绑定底层实现原理
2019/11/22 Javascript
小程序中手机号识别的示例
2020/12/14 Javascript
vue项目中openlayers绘制行政区划
2020/12/24 Vue.js
深入理解Django的中间件middleware
2018/03/14 Python
对Python中type打开文件的方式介绍
2018/04/28 Python
Django实现支付宝付款和微信支付的示例代码
2018/07/25 Python
Windows 64位下python3安装nltk模块
2018/09/19 Python
Python实现网页截图(PyQT5)过程解析
2019/08/12 Python
python使用pandas抽样训练数据中某个类别实例
2020/02/28 Python
世界上最大的艺术和工艺用品商店:MisterArt.com
2018/07/13 全球购物
泰国时尚电商:POMELO Fashion
2020/03/11 全球购物
欧姆龙医疗欧洲有限公司:Omron Healthcare Europe B.V
2020/06/13 全球购物
团支书的期末学习总结自我评价
2013/11/01 职场文书
大学生就业推荐信范文
2013/11/29 职场文书
向领导表决心的话
2014/03/11 职场文书
党员承诺书内容
2014/03/26 职场文书
房屋买卖协议书范本
2014/04/10 职场文书
竞聘演讲稿精彩开头和结尾
2014/05/14 职场文书
初一军训感言
2015/08/01 职场文书
《落花生》教学反思
2016/02/16 职场文书
Vue项目中如何封装axios(统一管理http请求)
2021/05/02 Vue.js
python ConfigParser库的使用及遇到的坑
2022/02/12 Python
【海涛解说】pis亲自推荐,其实你从来不会玩NW
2022/04/01 DOTA