详解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 相关文章推荐
一个用mysql_odbc和php写的serach数据库程序
Oct 09 PHP
php笔记之:php数组相关函数的使用
Apr 26 PHP
php对csv文件的读取,写入,输出下载操作详解
Aug 10 PHP
浅析linux下apache服务器的配置和管理
Aug 10 PHP
php计算当前程序执行时间示例
Apr 24 PHP
Laravel框架中扩展函数、扩展自定义类的方法
Sep 04 PHP
php删除数组中重复元素的方法
Dec 22 PHP
PHP中ID设置自增后不连续的原因分析及解决办法
Aug 21 PHP
php实现的读取CSV文件函数示例
Feb 07 PHP
PHP命名空间定义与用法实例分析
Aug 14 PHP
PHP递归统计系统中代码行数
Sep 19 PHP
tp5.0框架隐藏index.php入口文件及模块和控制器的方法分析
Feb 11 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/15 PHP
PHP实现获取文件后缀名的几种常用方法
2015/08/08 PHP
php无限分类使用concat如何实现
2015/11/05 PHP
jquery+thinkphp实现跨域抓取数据的方法
2016/10/15 PHP
PHP实现链式操作的三种方法详解
2017/11/16 PHP
犀利的js 函数集合
2009/06/11 Javascript
JavaScript 处理Iframe自适应高度(同或不同域名下)
2013/03/29 Javascript
jQuery实现随意改变div任意属性的名称和值(部分原生js实现)
2013/05/28 Javascript
Bootstrap+jfinal退出系统弹出确认框的实现方法
2016/05/30 Javascript
JS实现动画兼容性的transition和transform实例分析
2016/12/13 Javascript
Bootstrap CSS布局之表单
2016/12/17 Javascript
基于jquery实现五星好评
2017/11/18 jQuery
node.js通过axios实现网络请求的方法
2018/03/05 Javascript
利用vue-i18n实现多语言切换效果的方法
2019/06/19 Javascript
vue中get请求如何传递数组参数的方法示例
2019/11/08 Javascript
微信小程序跨页面传递data数据方法解析
2019/12/13 Javascript
vue 路由守卫(导航守卫)及其具体使用
2020/02/25 Javascript
js实现飞机大战小游戏
2020/08/26 Javascript
Js利用正则表达式去除字符串的中括号
2020/11/23 Javascript
python根据日期返回星期几的方法
2015/07/06 Python
python解析基于xml格式的日志文件
2017/02/25 Python
如何基于Python实现数字类型转换
2020/02/07 Python
python实现时间序列自相关图(acf)、偏自相关图(pacf)教程
2020/06/03 Python
CSS3悬停效果案例应用
2012/11/21 HTML / CSS
amazeui树节点自动展开折叠面板并选中第一个树节点的实现
2020/08/24 HTML / CSS
德国专业木制品经销商:Holz-Direkt24
2019/12/26 全球购物
资料员的岗位职责
2013/11/20 职场文书
营业员演讲稿
2013/12/30 职场文书
法律专业应届生自荐信范文
2014/01/06 职场文书
安全生产汇报材料
2014/02/17 职场文书
《黄山奇石》教学反思
2014/04/19 职场文书
班风口号
2014/06/18 职场文书
入党积极分子考察意见
2015/06/02 职场文书
严以用权学习心得体会
2016/01/12 职场文书
详解python的内存分配机制
2021/05/10 Python
原生JS实现分页
2022/04/19 Javascript