详解Laravel框架的依赖注入功能

 更新时间:2021年05月27日 11:35:52   作者:八重樱  
依赖注入不是让对象创建一个依赖关系,也不是让工厂对象去创建对象,而是将所需的依赖变成一个外部对象,使之成为一个"某些人的问题”,你为"某些人的问题”注入了类的依赖关系。在Laravel中,这个"某人”是服务容器,服务容器负责通过构造函数注入类的依赖关系。

概述

任何时候,你在一个控制器类中请求一个依赖,这个服务容器负责:

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强制下载类型的实现代码

    有时需要一些文件不能在线打开,而是执行后需要下载,这时就用这个函数就可以解决了
    2011-04-04
  • php的ddos攻击解决方法

    php的ddos攻击解决方法

    这篇文章主要介绍了php的ddos攻击解决方法,实例分析了ddos攻击程序的原理与针对性的解决方法,是非常实用的技巧,需要的朋友可以参考下
    2015-01-01
  • php使用ereg验证文件上传的方法

    php使用ereg验证文件上传的方法

    这篇文章主要介绍了php使用ereg验证文件上传的方法,是非常简单实用的正则验证技巧,具有一定的参考借鉴价值,需要的朋友可以参考下
    2014-12-12
  • PHP cookie,session的使用与用户自动登录功能实现方法分析

    PHP cookie,session的使用与用户自动登录功能实现方法分析

    这篇文章主要介绍了PHP cookie,session的使用与用户自动登录功能实现方法,结合实例形式分析了php使用cookie与session进行数据存取以及实现自动登陆功能的相关操作技巧,需要的朋友可以参考下
    2019-06-06
  • 在php中生成xml数据的三种方法

    在php中生成xml数据的三种方法

    这篇文章主要给大家介绍了在php中生成xml数据的三种方法,文章通过代码示例给大家介绍的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2023-11-11
  • php采用file_get_contents代替使用curl实例

    php采用file_get_contents代替使用curl实例

    这篇文章主要介绍了php采用file_get_contents代替使用curl的方法,实例讲述了file_get_contents模拟curl的post方法,对于服务器不支持curl的情况来说有一定的借鉴价值,需要的朋友可以参考下
    2014-11-11
  • php 截取GBK文档某个位置开始的n个字符方法

    php 截取GBK文档某个位置开始的n个字符方法

    下面小编就为大家带来一篇php 截取GBK文档某个位置开始的n个字符方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03
  • PHP基于简单递归函数求一个数阶乘的方法示例

    PHP基于简单递归函数求一个数阶乘的方法示例

    这篇文章主要介绍了PHP基于简单递归函数求一个数阶乘的方法,结合实例形式分析了php递归函数的定义与数学运算简单操作技巧,需要的朋友可以参考下
    2017-04-04
  • 在WordPress的后台中添加顶级菜单和子菜单的函数详解

    在WordPress的后台中添加顶级菜单和子菜单的函数详解

    这篇文章主要介绍了在WordPress的后台中添加顶级菜单和子菜单的函数详解,需要的朋友可以参考下
    2016-01-01
  • Laravel实现队列的示例代码

    Laravel实现队列的示例代码

    这篇文章主要为大家详细介绍了Laravel实现队列的相关知识,文中的示例代码讲解详细,具有一定的学习和借鉴价值,感兴趣的小伙伴可以跟随小编一起学习游戏
    2023-02-02

最新评论