详解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 相关文章推荐
php4的session功能评述(二)
Oct 09 PHP
一步一步学习PHP(6) 面向对象
Feb 16 PHP
PHP IPV6正则表达式验证代码
Feb 16 PHP
mysql总结之explain
Feb 27 PHP
header导出Excel应用示例
Jan 24 PHP
PHP return语句的另一个作用
Jul 30 PHP
PHP的反射类ReflectionClass、ReflectionMethod使用实例
Aug 05 PHP
PHP+FastCGI+Nginx配置PHP运行环境
Aug 07 PHP
php简单统计字符串单词数量的方法
Jun 19 PHP
PHP MySql增删改查的简单实例
Jun 21 PHP
php判断文件上传图片格式的实例详解
Sep 30 PHP
laravel中Redis队列监听中断的分析
Sep 14 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创建和删除目录函数介绍和递归删除目录函数分享
2014/11/18 PHP
php结合curl实现多线程抓取
2015/07/09 PHP
我整理的PHP 7.0主要新特性
2016/01/07 PHP
php实现保存周期为1天的购物车类
2017/07/07 PHP
PHP 记录访客的浏览信息方法
2018/01/29 PHP
phpstudy隐藏index.php的方法
2020/09/21 PHP
ajax请求get与post的区别总结
2013/11/04 Javascript
JQuery+Ajax实现数据查询、排序和分页功能
2015/09/27 Javascript
JS实现带圆弧背景渐变效果的导航菜单代码
2015/10/13 Javascript
跟我学习javascript的严格模式
2015/11/16 Javascript
深入理解Vue2.x的虚拟DOM diff原理
2017/09/27 Javascript
p5.js入门教程之小球动画示例代码
2018/03/15 Javascript
Javascript模拟实现new原理解析
2020/03/03 Javascript
[01:57]2016完美“圣”典风云人物:国士无双专访
2016/12/04 DOTA
安装Python的web.py框架并从hello world开始编程
2015/04/25 Python
Python在Console下显示文本进度条的方法
2016/02/14 Python
Python编程之微信推送模板消息功能示例
2017/08/21 Python
python实现m3u8格式转换为mp4视频格式
2018/02/28 Python
windows下python安装pip图文教程
2018/05/25 Python
python监控文件并且发送告警邮件
2018/06/21 Python
python实现三次样条插值
2018/12/17 Python
扩展Django admin的list_filter()可使用范围方法
2019/08/21 Python
Python守护进程实现过程详解
2020/02/10 Python
使用Python打造一款间谍程序的流程分析
2020/02/21 Python
Django ORM 查询表中某列字段值的方法
2020/04/30 Python
python3通过qq邮箱发送邮件以及附件
2020/05/20 Python
俄罗斯旅游网站:Tripadvisor俄罗斯
2017/03/21 全球购物
贪睡宠物用品:Snoozer Pet Products
2020/02/04 全球购物
澳大利亚第一旅行车和房车配件店:Caravan RV Camping
2020/12/26 全球购物
生日派对邀请函
2014/01/13 职场文书
法制宣传口号
2014/06/16 职场文书
怎样评估创业计划书是否有可行性?
2019/08/07 职场文书
2020年基层司法所建设情况调研报告
2019/11/30 职场文书
不负正版帝国之名 《重返帝国》引领SLG手游制作新的标杆
2022/04/07 其他游戏
Python使用socket去实现TCP客户端和TCP服务端
2022/04/12 Python