详解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 相关文章推荐
文件系统基本操作类
Nov 23 PHP
php下实现伪 url 的超简单方法[转]
Sep 24 PHP
某大型网络公司应聘时的笔试题目附答案
Mar 27 PHP
关于php连接mssql:pdo odbc sql server
Jul 20 PHP
Thinkphp中的volist标签用法简介
Jun 18 PHP
如何用PHP来实现一个动态Web服务器
Jul 29 PHP
浅析ThinkPHP缓存之快速缓存(F方法)和动态缓存(S方法)(日常整理)
Oct 26 PHP
Zend Framework教程之响应对象的封装Zend_Controller_Response实例详解
Mar 07 PHP
PHP程序中的文件锁、互斥锁、读写锁使用技巧解析
Mar 21 PHP
PHP Laravel 上传图片、文件等类封装
Aug 16 PHP
详解php 使用Callable Closure强制指定回调类型
Oct 26 PHP
apache集成php7.3.5的详细步骤
Jun 20 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实现无限级分类(不使用递归)
2015/10/22 PHP
php实现有序数组打印或排序的方法【附Python、C及Go语言实现代码】
2016/11/10 PHP
thinkphp5框架前后端分离项目实现分页功能的方法分析
2019/10/08 PHP
JavaScript中String和StringBuffer的速度之争
2010/04/01 Javascript
js 绑定键盘鼠标事件示例代码
2014/02/12 Javascript
原生JavaScript+LESS实现瀑布流
2014/12/12 Javascript
javascript三元运算符用法实例
2015/04/16 Javascript
微信WeixinJSBridge API使用实例
2015/05/25 Javascript
深入浅析javascript立即执行函数
2015/10/23 Javascript
详解Bootstrap的iCheck插件checkbox和radio
2016/08/24 Javascript
Bootstrap笔记—折叠实例代码
2017/03/13 Javascript
详解原生js实现offset方法
2017/06/15 Javascript
Vue仿手机qq的实例代码(demo)
2017/09/08 Javascript
AngularJS基于MVC的复杂操作实例讲解
2017/12/31 Javascript
js 将canvas生成图片保存,或直接保存一张图片的实现方法
2018/01/02 Javascript
使用typescript开发angular模块并发布npm包
2018/04/19 Javascript
Vue项目数据动态过滤实践及实现思路
2018/09/11 Javascript
解决iview多表头动态更改列元素发生的错误的方法
2018/11/02 Javascript
Cocos2d实现刮刮卡效果
2018/12/20 Javascript
JS匿名函数内部this指向问题详析
2019/05/10 Javascript
Vue2.x和Vue3.x的双向绑定原理详解
2020/11/05 Javascript
python实现清屏的方法
2015/04/30 Python
Python从文件中读取数据的方法讲解
2019/02/14 Python
python抖音表白程序源代码
2019/04/07 Python
Python彻底删除文件夹及其子文件方式
2019/12/23 Python
python基于三阶贝塞尔曲线的数据平滑算法
2019/12/27 Python
中国专业的综合网上购物商城:京东
2016/08/02 全球购物
海信商城:海信电视、科龙空调、容声冰箱官方专卖
2017/02/07 全球购物
SmartBuyGlasses比利时:购买品牌太阳镜和眼镜
2019/08/09 全球购物
一道SQL存储过程面试题
2016/10/07 面试题
物流管理毕业生自荐信
2013/10/24 职场文书
销售辞职报告范文
2014/01/12 职场文书
新员工入职感言
2014/02/01 职场文书
创先争优活动方案
2014/02/12 职场文书
社区节水倡议书
2015/04/29 职场文书
巴黎圣母院读书笔记
2015/06/26 职场文书