2.1. Getting started

未匹配的标注

PHP-DI入门

欢迎!本指南将帮助您开始在项目中使用PHP-DI。

在开始之前,您需要知道什么是依赖注入。如果你不知道,这里有篇文章专门讨论它: 理解依赖注入.

安装

使用 Composer 安装 PHP-DI:

composer require php-di/php-di

PHP-DI需要PHP 7.2或更高版本。

基本用法

1. 使用依赖注入

首先,让我们使用依赖注入来编写代码,而无需考虑PHP-DI:

class Mailer
{
    public function mail($recipient, $content)
    {
        // send an email to the recipient
    }
}
class UserManager
{
    private $mailer;

    public function __construct(Mailer $mailer)
    {
        $this->mailer = $mailer;
    }

    public function register($email, $password)
    {
        // The user just registered, we create his account
        // ...

        // We send him an email to say hello!
        $this->mailer->mail($email, 'Hello and welcome!');
    }
}

如我们所见,UserManagerMailer作为构造函数参数:这是依赖项注入!

2. 创建容器

您可以很容易地创建一个预配置好的,用于开发的容器实例:

$container = new DI\Container();

如果要注册定义文件(相关内容请查阅PHP definitions) 或调整配置选项,则可以使用 container builder:

$builder = new DI\ContainerBuilder();
$builder->...
$container = $builder->build();

3. 创建对象

没有PHP-DI,我们将不得不像这样手动“连接”依赖项:

$mailer = new Mailer();
$userManager = new UserManager($mailer);

相反, 我们可以让PHP-DI找出依赖关系:

$userManager = $container->get('UserManager');

PHP-DI 会在默默地为你创建 一个Mailer 对象跟一个 UserManager 对象。

它怎么知道要注入什么呢?

容器使用一种称为 autowiring的技术。 这不是 PHP-DI 独有的, 但这却是很棒棒的技术。它将扫描代码,并查看构造函数中需要哪些参数。

在我们的例子中, UserManager 的构造函数需要一个 Mailer 对象: PHP-DI 知道需要创建这个对象. 很基本,但是非常有效。

等等,像这样扫描PHP代码不是很奇怪又冒险吗?

不用担心, PHP-DI 使用了 PHP反射 。 Laravel, Zend Framework 跟其他许多容器都在使用。在性能方面。 此类信息仅读取一次然后进行缓存,不会产生任何影响。

定义注入

我们已经了解了 autowiring, 一种让 PHP-DI 自动找到类的依赖项技术。但是我们有3种方法来定义要在类中注入的内容 :

它们中的每一个都是不同的并且是可选的。这是PHP定义的示例:

return [
    'api.url'    => 'http://api.example.com',
    'Webservice' => function (Container $c) {
        return new Webservice($c->get('api.url'));
    },
    'Controller' => DI\create()
        ->constructor(DI\get('Webservice')),
];

请阅读 定义注入 文档 来学习关于 autowiring,annotations 和 PHP definitions。

框架集成

在上面的示例中,我们可以使用容器获取对象:

$userManager = $container->get('UserManager');

但是,我们不想在应用程序中的任何地方调用容器:因为这样会耦合我们的代码到容器。这被称为服务定位器反模式 - 或者依赖“获取”而不是“注入”。

引用Symfony文档:

您有时需要从容器中获取[对象],但这在应用程序的入口点应尽可能少。

因此, PHP-DI 集成了一些框架, 所以你不需要调用容器 (因为依赖项已注入控制器中):

如果要通过其他框架或自己的代码使用PHP-DI, 尝试在根应用程序类或前端控制器中使用$container->get()。 可以看看 demo应用,这是以 PHP-DI 创建的练习项目。

下一步做什么?

你可以转到 文档索引。也可以查看 最佳实践指南, 这可以让我们很好地了解该在何时使用PHP-DI的每个功能。

这些是您现在可能会感兴趣的一些其他主题:

本文章首发在 LearnKu.com 网站上。

本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。

原文地址:https://learnku.com/docs/php-di/6.0/gett...

译文地址:https://learnku.com/docs/php-di/6.0/gett...

上一篇 下一篇
贡献者:2
讨论数量: 0
发起讨论 只看当前版本


暂无话题~