返回
热门搜索

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

IT博客 操作系统 linux 点击量 423

基本信息 收藏 - 举报 - 海报

详细介绍

目录
概述真实的例子结论

概述

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

1.自动地在构造函数中检测依赖关系

2.如果需要构建这个依赖关系

3.通过构造函数创建对象形成依赖关系

来看一个非常简单的例子。

<?php
namespace AppHttpControllers;
use AppUser;
use AppRepositoriesUserRepository;
use AppHttpControllersController;
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("MyService", function($container) {
return new MyService($container->make("MyAnotherService"));
});

您需要创建一个服务提供商来注册上述服务。

<?php
namespace AppProviders;
use IlluminateSupportServiceProvider;
class MyServiceProvider extends ServiceProvider
{
    public function register()
    {
        $this->app->singleton(MyService::class, function ($app) {
            return new MyService($app->make("MyAnotherService"));
        });
    }
}

当MyService需要被解析的时候,负责返回一个对象的回调函数就会被调用。

<?php
namespace AppHttpControllers;
use AppUser;
use AppHttpControllersController;
class MyController extends Controller
{
    protected $myService;
    public function __construct(MyService $myService)
    {
        $this->myService = $myService;
    }
    // .. 方法
}

真实的例子

假设你的应用需要Facebook的PHP SDK来访问Facebook的API,你的控制器就是这样的:

<?php
namespace AppHttpControllers;
use AppUser;
use AppHttpControllersController;
use FacebookFacebook;
class FacebookApiAccessController extends Controller
{
    protected $facebook;
    public function __construct(FacebookFacebook $facebook)
    {
        $this->facebook = $facebook;
    }
    //.. action methods here
}

现在,您需要告诉Service Container如何构建FacebookFacebook的实例.

<?php
$container->singleton("FacebookFacebook", function() {
  return new FacebookFacebook([
    "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框架的依赖注入功能的资料请关注IT博客社区其它相关文章!

没有更多内容。

用户评价(0)

好评度100%
  • 还没有人评论此条信息!
+ 加载更多

联系方式

提示:联系我时,请说明在巅云php学苑看到的,谢谢!
  • 联系人:
  • 地  区:
  • 电  话: 共发布信息(2004)条 所在地:未填写
看了又看
加载中
首页 首页 收藏 收藏

电话联系