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

admin3年前PHP教程85
目录
概述真实的例子结论
概述

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

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框架的依赖注入功能的资料请关注其它相关文章!

免责声明:本文内容来自用户上传并发布,站点仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。请核实广告和内容真实性,谨慎使用。

相关文章

合法合规稳定的海外跨境直播网络-直播快

据海关统计,中国跨境电商进出口5年增长近10倍,2021年规模就达到了1.92万亿元人民币,增长18.6%。根据天眼查数据显示,截至目前,我国有超60万家跨境电商,其中跨境直播爆发式增长,直播类APP...

GPU服务器的功能包括哪些?新加坡GPU服务器适合哪些行业购买?

GPU服务器是装有GPU(图形处理单元)的服务器。GPU,也称为图形卡或视频卡,是一种专门的电子电路,可加速创建和渲染计算机图形、视频等的过程。它执行快速数学计算,同时释放CPU以执行其他任务。GPU...

如何选择韩国多ip服务器才正确?韩国多ip服务器租用地址是多少?

由于韩国地域的特殊性,使用服务器可以免备案,许多企业开始选择韩国多ip服务器,接下来我们来谈谈如何选择韩国多ip服务器才正确?1.韩国多ip服务器的速度韩国多ip服务器的运转速度直接影响着站群的呼应时...

香港高防服务器价格贵吗受什么影响

香港高防服务器价格贵吗?受什么影响?香港高防服务器的价格相对来说可能会比一般的服务器价格略高一些,这是因为它们提供了更强大的网络安全保护和更高的网络质量。此外,香港的物价也比较高,这也是导致香港高防服...

如何用PHP websocket实现网页实时聊天

目录前言websocket简介与http的关系握手数据传输PHP 实现 websocket 服务器文件描述符创建服务器socket服务器逻辑客户端创建客户端页面功能用户名异步处理总结前言最近艰难地&l...

聊聊PHP中的 === 运算符为什么比 == 快

在上一篇《聊聊PHP中require_once()函数为什么不好用》中给大家介绍了PHP中require_once()为什么不好用的原因,感兴趣的朋友可以去阅读了解一下~那么本文将给大家介绍PHP中的...