详解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下编码转换函数mb_convert_encoding与iconv的使用说明
Dec 16 PHP
一个基于PDO的数据库操作类
Mar 24 PHP
fleaphp crud操作之findByField函数的使用方法
Apr 23 PHP
php学习之变量的使用
May 29 PHP
PHP实现视频文件上传完整实例
Aug 28 PHP
php导出CSV抽象类实例
Sep 24 PHP
PHP正则验证Email的方法
Jun 15 PHP
Symfony2框架创建项目与模板设置实例详解
Mar 17 PHP
PHP实现随机生成水印图片功能
Mar 22 PHP
php获取excel文件数据
Apr 21 PHP
php面向对象的用户登录身份验证
Jun 08 PHP
PHP 结合 Boostrap 结合 js 实现学生列表删除编辑及搜索功能
May 21 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脚本代码
2011/02/19 PHP
PHP魔术方法使用方法汇总
2016/02/14 PHP
document.all还是document.getElementsByName?
2006/07/21 Javascript
Javascript 验证上传图片大小[客户端]
2009/08/01 Javascript
js 动态选中下拉框
2009/11/26 Javascript
按给定几率进行随机抽取的js代码
2010/12/28 Javascript
jquery购物车实时结算特效实现思路
2013/09/23 Javascript
在Html中使用Requirejs进行模块化开发实例详解
2016/04/15 Javascript
Bootstrap 网站实例之单页营销网站
2016/10/20 Javascript
禁用backspace网页回退功能的实现代码
2016/11/15 Javascript
Angular.js中处理页面闪烁的方法详解
2017/03/09 Javascript
Angular6 写一个简单的Select组件示例
2018/08/20 Javascript
React Component存在的几种形式详解
2018/11/06 Javascript
在Vue项目中使用snapshot测试的具体使用
2019/04/16 Javascript
[42:32]DOTA2上海特级锦标赛B组资格赛#2 Fnatic VS Spirit第二局
2016/02/27 DOTA
Python编程中实现迭代器的一些技巧小结
2016/06/21 Python
python3.4.3下逐行读入txt文本并去重的方法
2018/04/29 Python
在Django中URL正则表达式匹配的方法
2018/12/20 Python
Python实现字符串匹配的KMP算法
2019/04/04 Python
python实现列表的排序方法分享
2019/07/01 Python
用Python写一个自动木马程序
2019/09/17 Python
python找出列表中大于某个阈值的数据段示例
2019/11/24 Python
pytorch模型预测结果与ndarray互转方式
2020/01/15 Python
Django+RestFramework API接口及接口文档并返回json数据操作
2020/07/12 Python
python里glob模块知识点总结
2021/01/05 Python
详解HTML5新增标签
2017/11/27 HTML / CSS
美国新娘礼品店:The Paisley Box
2020/09/08 全球购物
群胜软件Java笔试题
2012/09/29 面试题
就业推荐表自我鉴定
2013/10/29 职场文书
常务副县长“四风”个人对照检查材料思想汇报
2014/10/02 职场文书
自我查摆剖析材料
2014/10/11 职场文书
员工开除通知书
2015/04/25 职场文书
2015年人事科工作总结
2015/04/28 职场文书
第一书记观后感
2015/06/08 职场文书
2019年大学生学年自我鉴定!
2019/03/25 职场文书
职场新人知识:如何制定一份合理的工作计划?
2019/09/11 职场文书