详解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获取网站域名和地址的代码
Aug 17 PHP
为PHP初学者的8点有效建议
Nov 20 PHP
php中一个完整表单处理实现代码
Nov 10 PHP
用PHP提取中英文词语以及数字的首字母的方法介绍
Apr 23 PHP
php读取目录所有文件信息dir示例
Mar 18 PHP
PHP Curl出现403错误的解决办法
May 29 PHP
php实现用于计算执行时间的类实例
Apr 18 PHP
jQuery+PHP发布的内容进行无刷新分页(Fckeditor)
Oct 22 PHP
Composer设置忽略版本匹配的方法
Apr 27 PHP
Laravel框架创建路由的方法详解
Sep 04 PHP
php 多继承的几种常见实现方法示例
Nov 18 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 数组基础知识小结
2010/08/20 PHP
thinkphp获取栏目和文章当前位置的方法
2014/10/29 PHP
phpmyadmin中禁止外网使用的方法
2014/11/04 PHP
php可应用于面包屑导航的递归寻找家谱树实现方法
2015/02/02 PHP
php类中的$this,static,final,const,self这几个关键字使用方法
2015/12/14 PHP
Laravel5.* 打印出执行的sql语句的方法
2017/07/24 PHP
用tip解决Ext列宽度不够的问题
2008/12/13 Javascript
javascript事件冒泡详解和捕获、阻止方法
2014/04/12 Javascript
javascript框架设计读书笔记之模块加载系统
2014/12/02 Javascript
javascript使用正则表达式检测IP地址
2014/12/03 Javascript
在AngularJS中使用AJAX的方法
2015/06/17 Javascript
详解AngularJS的通信机制
2015/06/18 Javascript
基于jQuery实现顶部导航栏功能
2016/12/27 Javascript
微信小程序 PHP后端form表单提交实例详解
2017/01/12 Javascript
利用imgareaselect辅助后台实现图片上传裁剪
2017/03/02 Javascript
Nodejs把接收图片base64格式保存为文件存储到服务器上
2018/09/26 NodeJs
vue安装和使用scss及sass与scss的区别详解
2018/10/15 Javascript
vuex如何重置所有state(可定制)
2019/01/17 Javascript
简述pm2常用命令集合及配置文件说明
2019/05/30 Javascript
微信小程序自定义多列选择器使用详解
2019/06/21 Javascript
微信小程序利用button控制条件标签的变量问题
2020/03/15 Javascript
Angular5整合富文本编辑器TinyMCE的方法(汉化+上传)
2020/05/26 Javascript
vue使用vue-quill-editor富文本编辑器且将图片上传到服务器的功能
2021/01/13 Vue.js
解决python3中解压zip文件是文件名乱码的问题
2018/03/22 Python
解决pycharm py文件运行后停止按钮变成了灰色的问题
2018/11/29 Python
python获取url的返回信息方法
2018/12/17 Python
python 执行文件时额外参数获取的实例
2018/12/18 Python
python仿evething的文件搜索器实例代码
2019/05/13 Python
基于Numba提高python运行效率过程解析
2020/03/02 Python
股权收购意向书
2014/04/01 职场文书
《赶海》教学反思
2014/04/20 职场文书
2015学习委员工作总结范文
2015/04/03 职场文书
小学教师党员承诺书
2015/04/27 职场文书
优秀团员主要事迹材料
2015/11/05 职场文书
Nginx配置80端口访问8080及项目名地址方法解析
2021/03/31 Servers
Nginx反向代理至go-fastdfs案例讲解
2021/08/02 Servers