详解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中的extract的作用分析
Apr 09 PHP
phpword插件导出word文件时中文乱码问题处理方案
Aug 19 PHP
php微信公众平台开发类实例
Apr 01 PHP
PHP实现在线阅读PDF文件的方法
Jun 23 PHP
PHP中static关键字以及与self关键字的区别
Jul 01 PHP
使用XHGui来测试PHP性能的教程
Jul 03 PHP
PHP实现清除wordpress里恶意代码
Oct 21 PHP
基于PHP微信红包的算法探讨
Jul 21 PHP
PHP简单实现解析xml为数组的方法
May 02 PHP
thinkPHP框架动态配置用法实例分析
Jun 14 PHP
PHP+iframe模拟Ajax上传文件功能示例
Jul 02 PHP
如何用RabbitMQ和Swoole实现一个异步任务系统
May 29 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在不同页面间传递Json数据示例代码
2013/06/08 PHP
ThinkPHP CURD方法之order方法详解
2014/06/18 PHP
通过Email发送PHP错误的方法
2015/07/20 PHP
实例讲解yii2.0在php命令行中运行的步骤
2015/12/01 PHP
php中各种定义变量的方法小结
2017/10/18 PHP
FormValid0.5版本发布,带ajax自定义验证例子
2007/08/17 Javascript
仿jQuery的siblings效果的js代码
2011/08/09 Javascript
JavaScript 学习笔记之一jQuery写法图片等比缩放以及预加载
2012/06/28 Javascript
js函数调用的方式
2014/05/06 Javascript
JavaScript数据推送Comet技术详解
2016/04/07 Javascript
全面解析标签页的切换方式
2016/08/21 Javascript
AngularJS通过$location获取及改变当前页面的URL
2016/09/23 Javascript
利用React-router+Webpack快速构建react程序
2016/10/27 Javascript
angular ngClick阻止冒泡使用默认行为的方法
2016/11/03 Javascript
详解JavaScript按概率随机生成事件
2017/08/02 Javascript
JavaScript监听手机物理返回键的两种解决方法
2017/08/14 Javascript
ES6解构赋值的功能与用途实例分析
2017/10/31 Javascript
Vue单页及多页应用全局配置404页面实践记录
2018/05/22 Javascript
nodejs遍历文件夹下并操作HTML/CSS/JS/PNG/JPG的方法
2018/11/01 NodeJs
angular4中引入echarts的方法示例
2019/01/29 Javascript
JS实现压缩上传图片base64长度功能
2019/12/03 Javascript
html5以及jQuery实现本地图片上传前的预览代码实例讲解
2021/03/01 jQuery
[02:25]专访DOTA2负责人Erik 国际邀请赛暂不会离开西雅
2014/07/21 DOTA
python中对list去重的多种方法
2014/09/18 Python
17个Python小技巧分享
2015/01/23 Python
python获取linux系统信息的三种方法
2020/10/14 Python
HTML5的postMessage的使用手册
2018/12/19 HTML / CSS
美国孕妇装品牌:Destination Maternity
2018/02/04 全球购物
总经理秘书工作职责
2013/12/26 职场文书
暑期培训随笔感言
2014/03/10 职场文书
解除聘用合同证明书范本
2014/09/11 职场文书
小学国庆节活动方案策划书
2014/09/16 职场文书
红领巾广播站广播稿(3篇)
2014/09/20 职场文书
排查并解决Oracle sysaux表空间异常增长
2022/04/20 Oracle
Python绘制散乱的点构成的图的方法
2022/04/21 Python
Python Flask实现进度条
2022/05/11 Python