From Apprentice To Artisan 翻译 03

The IoC Container 控制反转容器

Basic Binding 基础绑定

Now that we‘ve learned about dependency injection, let‘s explore inversion of control containers.
IoC containers make managing your class dependencies much more convenient, and Laravel ships with a very powerful container. The IoC container is the certral piece of the Laravel framework, and it is what allows all of the framework‘s jcomponents jto work together. In fact, the Laravel Application class extends the Container class!

我们已经学习了依赖注入,接下来咱们一起来探索“控制反转容器”(IoC)。 IoC容器可以使你更容易管理依赖注入,Laravel框架拥有一个很强大的IoC容器。Laravel的核心就是这个IoC容器,这个IoC容器使得框架各个组件能很好的在一起工作。事实上Laravel的Application类就是继承自Container类!

IoC Container 控制反转容器

Inversion of control containers make dependency injection more convenient. How to resolve a given class or interface >is defined once in the container, which manages resolving and injecting those objects throughout your application.

控制反转容器使得依赖注入更方便。当一个类或接口在容器里定义以后,如何处理它们——如何在应用中管理、注入这些对象?

In a Laravel application, the IoC container can be accessed via the App facade. The container has a variety of methods, but we‘ll start with the most basic. Let‘s continue to use our BillerInterface and BillingNotifierInterface from the previous chapter, and assume that our application is using Stripe to process payments. We can bind the Stripe implementation of the interface to the container like this:

在Laravel应用里,你可以通过App来访问控制反转容器。容器有很多方法,不过我们从最基础的开始。让我们继续使用上一章写的BillerInterface和BillingNotifierInterface,且假设我们使用了Stripe来进行支付操作。我们可以将Stripe的支付实现绑定到容器里,就像这样:

App::bind(‘BillerInterface‘, function()
{
    return new StripeBiller(App::make(‘BillingNotifierInterface‘));
});

Notice that within our BillingInterface resolver, we also resolve a BillingNotifierInterface implementation. Let‘s define that binding as well:

注意在我们处理BillingInterface时,我们额外需要一个BillingNotifierInterface的实现,也就是再来一个bind:

App::bind(‘BillingNotifierInterface‘, function()
{
    return new EmailBillingNotifier;
});

So, as you can see, the container is a place to store Closures that resolve various classes. Once a class has been registered with the container, we can easily resolve it from anywhere in our application. We can even resolve other container bindings within a resolver.

如你所见, 这个容器就是个用来存储各种绑定的地方(译者注:这么理解简单点。再扯匿名函数、闭包就扯远了。)。一旦一个类在容器里绑定了以后,我们可以很容易的在应用的任何位置调用它。我们甚至可以在bind函数内写另外的bind。

Have Acne?

The Laravel IoC container is a drop-in replacement for the Pimple IoC container by Fabien Potencier. So, if you‘re already using Pimple on a project, feel free to upgrade to the Illuminate Container component for a few more features!

Laravel框架的Illuminate容器和另一个名为Pimple的IoC容器是可替换的。所以如果你之前用的是Pimple,你尽可以大胆的升级为Illuminate Container,后者还有更多新功能!

Once we‘re using the container, we can switch interface implementations with a single line change.
For example, consider the following:

一旦我们使用了容器,切换接口的实现就是一行代码的事儿。
比如考虑以下代码:

class UserController extends BaseController{

    public function __construct(BillerInterface $biller)
    {
        $this->biller = $biller;
    }
}

When this controller is instantiated via the IoC container, the StripeBiller, which includes the EmailBillingNotifier, will be injected into the instance. Now, if we want to change our notifier implementation, we can simply change the binding to this:

当这个控制器通被容器实例化后,包含着EmailBillingNotifier的StripeBiller会被注入到这个控制器中(译者注:见上文的两个bind)。如果我们现在想要换一种提示方式,我们可以简单的将代码改为这样:

App::bind(‘BillingNotifierInterface‘, function()
{
    return new SmsBillingNotifier;
});

Now, it doesn‘t matter where the notifier is resolved in our application, we will now always get the SmsBillingNotifier implementation. Utilizing this architecture, our application can be rapidly shifted to new implementations of various services.

现在不管在应用的哪里需要一个提示器,我们总会得到SmsBillingNotifier的对象。利用这种结构,我们的应用可以在不同的实现方式之间快速切换。

Being able to change implementations of an interface with a single line is amazingly powerful. For example, imagine we want to change our SMS service from a legacy provider to Twilio. We can develop a new Twilio implementation of the notifier and swap our binding. If we have problems with the transition to Twilio, we can quickly change back to the legacy provider by making a single IoC binding change. As you can see, the benefits of using dependency injection go beyond what is immediately obvious. Can you think of more benefits for using dependency injection and an IoC container?

只改一行就能切换代码实现,这可是很厉害的能力。比如我们想把短信服务从原来的提供商替换为Twilio。我们可以开发一个新的Twilio的提示器类(译者注:当然要继承自BillingNotifierInterface)然后修改绑定语句。如果Twilio有任何闪失,我们只需修改一行代码就可以快速的切换回原来的短信提供商。看到了吧,依赖注入的好处多得很呢。你能再想出几个使用依赖注入和控制反转容器的好处么?

Sometimes you may wish to resolve only one instance of a given class throughout your entire application. This can be achieved via the singjleton method on the container class:

想在应用中只实例化某类一次?没问题,使用singleton方法吧:

App::singleton(‘BillingNotifierInterface‘, function()
{
    return new SmsBillingNotifier;
});

Now, once the container has resolved the billing notifier once, it will continue to use that same instance for all subsequent requests for that interface.

这样只要这个容器生成了这个提示器对象一次, 在接下来的生成请求中容器都只会提供这同样的一个对象。

The instance method on the container is similar to singleton, however, you are able to pass an already existing object instance. The instance you give to the container will be used each time the container needs an instance of that class:

容器的instance方法和singleton方法很类似,区别是instance可以绑定一个已经存在的对象。然后容器每次返回的都是这个对象了。

$notifier = new SmsBillingNotifier;
App::instance(‘BillingNotifierInterface‘, $notifier);

Now that we‘re familiar with basic container resolution using Closures, let‘s dig into its most powerful feature: the ability to resolve class via reflection.

现在我们熟悉了容器的基础用法,让我们深入发掘它更强大的功能:依靠反射来处理类和接口。

Stand Alone Container容器独立运行

Working on a project that isn‘t built on Laravel? You can still utilize Laravel‘s IoC container by installing the illuminate/container package via Composer!

你的项目没有使用Laravel?但你依然可以使用Laravel的IoC容器!只要用Composer安装了illuminate/container包就可以了。

时间: 2024-12-17 08:59:41

From Apprentice To Artisan 翻译 03的相关文章

From Apprentice To Artisan 翻译 01

Dependency Injection 依赖注入 The Problem 遇到的问题 The foundation of the Laravel framework is its powerful IoC container. To truly understand the framework, a strong grasp of the container is necessary. However, we shold note that an IoC container is simply

From Apprentice To Artisan 翻译 04

Reflect Resolution 反射解决方案 One of the most powerful features of the Laravel container is its ability to automatically resolve dependencies via reflection. Reflection is the ability to inspect a classes and methods. For example, the PHP ReflectionClass

From Apprentice To Artisan 翻译 02

Respect Boundaries 严守边界 Remember to respect responsibility boundaries. Controllers and routes serve as a mediator between HTTP and your application. When writing large applications, don't clutter them up with your domain logic. 记得要保持清晰的责任边界. 控制器和路由是作

Laravel artisan 命令工具

01.php artisan:显示详细的命令行帮助信息,同 php artisan list 02.php artisan –help:显示帮助命令的使用格式,同 php artisan help 03.php artisan –version:显示当前使用的 Laravel 版本 04.php artisan changes:列出当前版本相对于上一版本的主要变化 05.php artisan down:将站点设为维护状态 06.php artisan up:将站点设回可访问状态 07.php

6. Laravel5学习笔记:IOC/DI的理解

介绍 IOC 控制反转 Inversion of Control 依赖关系的转移 依赖抽象而非实践 DI 依赖注入 Dependency Injection 不必自己在代码中维护对象的依赖 容器自动根据配置,将依赖注入指定对象 IOC.DI对于Laravel的意义 Laravel框架的基础是一个功能强大的控制反转容器(IoC container). 为了真正理解该框架,需要好好掌握该容器.然而我们需要了解,控制反转容器只是一种用于方便实现"依赖注入"的工具.但要实现依赖注入并不一定需要

【翻译习作】 Windows Workflow Foundation程序开发-第一章03

1.2.2.Visual Studio 2005扩展包 微软也为Windows Workflow开发者提供了Visual Studio 2005扩展包.扩展包将许多功能集成到Visual Studio里,其中就包括一个用于编制工作流的可视化设计器.下面就是可视化设计器的截屏图. 这个设计器的窗口式样与我们所熟悉的Windows和Web表单设计器保持一致.Toolbox(工具箱)窗口中列出了可以拖放到设计器台面上的所有活动.我们也可以把自定义的活动添加到Toolbox中去.一旦把一个活动放置到设计

异步编程系列第03章 自己写异步代码

p { display: block; margin: 3px 0 0 0; } --> 写在前面 在学异步,有位园友推荐了<async in C#5.0>,没找到中文版,恰巧也想提高下英文,用我拙劣的英文翻译一些重要的部分,纯属娱乐,简单分享,保持学习,谨记谦虚. 如果你觉得这件事儿没意义翻译的又差,尽情的踩吧.如果你觉得值得鼓励,感谢留下你的赞,愿爱技术的园友们在今后每一次应该猛烈突破的时候,不选择知难而退.在每一次应该独立思考的时候,不选择随波逐流,应该全力以赴的时候,不选择尽力而

【分享】VNR翻译日语游戏汉化简易图解教材

请[点击图片]到新链接看[原图].不然博客自动缩小图,看不清图解. 上面是用美少女万花镜来测试新版VNR翻译的如何,结果比我预料还要好.以前旧版根本比不上新版的.翻译非常准确.看了我上面的简易VNR图解,应该了解了怎样翻译了吧.接下来就是D.C.III.RX翻译. 来看下翻译效果吧. 最新版文本设置,其它还都是一样. D.C.III RX在VNR下全屏化 如果出现部分打开GAL游戏VNR却不自动弹出翻译窗口和翻译不出文本,请看下面解决方法. 提取文本后无法翻译或翻译不完整,不通顺解决方法 D.C

第03章-VTK系统概述(1)

[译者:这个系列教程是以Kitware公司出版的<VTK User's Guide -11th edition>一书作的中文翻译(出版时间2010年,ISBN: 978-1-930934-23-8),由于时间关系,我们不能保证每周都能更新本书内容,但尽量做到一周更新一篇到两篇内容.敬请期待^_^.欢迎转载,另请转载时注明本文出处,谢谢合作!同时,由于译者水平有限,出错之处在所难免,欢迎指出订正!] 本章旨在介绍VTK系统的总体概述,并讲解运用C++.Java.Tcl和Python等语言进行VT