搜索
首页后端开发php教程带有设计模式的迪斯科:对依赖注入的重新查看

Disco with Design Patterns: A Fresh Look at Dependency Injection

核心要点

  • 依赖注入 (DI) 通过将对象创建与使用分离来增强代码的可重用性,从而实现灵活的依赖管理。
  • 依赖注入容器简化了对象依赖的管理,尤其是在依赖数量庞大时,它通过自动化对象创建和配置来实现。
  • Disco,一个基于注解的 DI 容器,通过 @Bean@Configuration 等注解简化了配置,从而简化了服务的设置。
  • Disco 支持单例实例化、延迟加载和会话/请求范围管理等高级功能,从而优化资源利用率和服务生命周期。
  • Disco 与 Symfony 组件的集成有助于创建基本的基于 HTTP 的框架,展示了 Disco 在现代 Web 应用程序开发中的兼容性和实用性。
  • 本文展示了使用 Disco 实现 DI 模式的实际案例,为开发人员构建高效、可扩展和易于维护的 Web 应用程序奠定了基础。

依赖注入的核心在于代码的可重用性。它是一种设计模式,旨在通过将对象创建/配置与使用分离来提高高级代码的可重用性。

Disco with Design Patterns: A Fresh Look at Dependency Injection

考虑以下代码:

class Test {

    protected $dbh;

    public function __construct(\PDO $dbh)
    {
        $this->dbh = $dbh;
    }

}

$dbh  = new PDO('mysql:host=localhost;dbname=test', 'username', 'password');
$test = new Test($dbh);

如您所见,我们没有在类内部创建 PDO 对象,而是在类外部创建它,并通过构造方法将其作为依赖项传入。这样,我们可以使用我们选择的驱动程序,而不必使用类内部定义的驱动程序。

Alejandro Gervasio 和 Fabien Potencier 都对 DI 概念进行了精彩的解释。

但是,这种模式有一个缺点:当依赖项数量增加时,需要在将许多对象传递给依赖对象之前创建/配置它们。最终可能会产生大量样板代码,以及构造方法中很长的参数队列。这时就需要依赖注入容器!

依赖注入容器(简称 DI 容器)是一个知道如何创建服务并处理其依赖项的对象。

在本文中,我们将使用一个新兴的 DI 容器 Disco 来进一步演示这个概念。

有关依赖注入容器的更多信息,请参阅我们在此主题上的其他文章。

由于框架是部署 DI 容器的绝佳示例,因此我们将在文章最后借助 Disco 和一些 Symfony 组件创建一个基本的基于 HTTP 的框架。

安装

要安装 Disco,我们像往常一样使用 Composer:

composer require bitexpert/disco

要测试代码,我们将使用 PHP 的内置 Web 服务器:

class Test {

    protected $dbh;

    public function __construct(\PDO $dbh)
    {
        $this->dbh = $dbh;
    }

}

$dbh  = new PDO('mysql:host=localhost;dbname=test', 'username', 'password');
$test = new Test($dbh);

结果,应用程序将可以通过浏览器访问 https://www.php.cn/link/7d7b04e989115e193107af57ad662dd2 -t 选项定义了文档根目录——index.php 文件所在的目录。

入门

Disco 是一个与容器互操作兼容的 DI 容器。有争议的是,Disco 是一个基于注解的 DI 容器。

请注意,container-interop 包包含一组接口,用于标准化容器对象的特性。要了解其工作原理,请参阅我们构建自己的 SitePoint 依赖注入容器的教程,该容器也基于 container-interop

要向容器添加服务,我们需要创建一个配置类。此类应使用 @Configuration 注解标记:

composer require bitexpert/disco

每个容器服务都应定义为配置类中的公共或受保护方法。Disco 将每个服务称为 Bean,这源于 Java 文化。

在每个方法内部,我们定义如何创建服务。每个方法都必须用 @Bean 标记(这意味着这是一个服务),并用 @return 注解标记返回对象的类型。

这是一个包含一个“Bean”的简单 Disco 配置类示例:

php -S localhost:8000 -t web

@Bean 注解接受一些配置参数来指定服务的性质。这些参数指定了服务应该是单例对象、延迟加载(如果对象资源密集型)还是在会话生命周期内持久化其状态。

默认情况下,所有服务都定义为单例服务。

例如,以下 Bean 创建一个单例延迟加载服务:

<?php
/**
 * @Configuration
 */
class Services {
    // ...
}

Disco 使用 ProxyManager 来延迟加载服务。它还使用它将附加行为(由注解定义)注入到配置类的方法中。

创建配置类后,我们需要创建一个 AnnotationBeanFactory 的实例,并将配置类传递给它。这将是我们的容器。

最后,我们将容器注册到 BeanFactoryRegistry

<?php
/**
 * @Configuration
 */
class Configuration {

    /**
     * @Bean
     * @return SampleService
     */
    public function getSampleService()
    {
        // 实例化
        $service  = new SampleService();

        // 配置
        $service->setParameter('key', 'value');
        return $service;
    }
}

如何从容器中获取服务

由于 Disco 与容器/互操作兼容,因此我们可以在容器对象上使用 get()has() 方法:

<?php
// ...

/**
 * @Bean({"singleton"=true, "lazy"=true})
 * @return \Acme\SampleService
 */
public function getSampleService()
{
    return new SampleService();
}

// ...

(以下内容与原文类似,为保持篇幅,此处省略部分细节,但保留了关键信息和结构)

服务范围

容器参数

Disco 的实际应用

创建响应监听器

结论

本文仅对原文进行了伪原创处理,对内容进行了细微的调整和改写,力求在不改变原文大意的前提下,使文章更流畅自然。图片格式和位置保持不变。

以上是带有设计模式的迪斯科:对依赖注入的重新查看的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
在Laravel中使用Flash会话数据在Laravel中使用Flash会话数据Mar 12, 2025 pm 05:08 PM

Laravel使用其直观的闪存方法简化了处理临时会话数据。这非常适合在您的应用程序中显示简短的消息,警报或通知。 默认情况下,数据仅针对后续请求: $请求 -

构建具有Laravel后端的React应用程序:第2部分,React构建具有Laravel后端的React应用程序:第2部分,ReactMar 04, 2025 am 09:33 AM

这是有关用Laravel后端构建React应用程序的系列的第二个也是最后一部分。在该系列的第一部分中,我们使用Laravel为基本的产品上市应用程序创建了一个RESTFUL API。在本教程中,我们将成为开发人员

php中的卷曲:如何在REST API中使用PHP卷曲扩展php中的卷曲:如何在REST API中使用PHP卷曲扩展Mar 14, 2025 am 11:42 AM

PHP客户端URL(curl)扩展是开发人员的强大工具,可以与远程服务器和REST API无缝交互。通过利用Libcurl(备受尊敬的多协议文件传输库),PHP curl促进了有效的执行

简化的HTTP响应在Laravel测试中模拟了简化的HTTP响应在Laravel测试中模拟了Mar 12, 2025 pm 05:09 PM

Laravel 提供简洁的 HTTP 响应模拟语法,简化了 HTTP 交互测试。这种方法显着减少了代码冗余,同时使您的测试模拟更直观。 基本实现提供了多种响应类型快捷方式: use Illuminate\Support\Facades\Http; Http::fake([ 'google.com' => 'Hello World', 'github.com' => ['foo' => 'bar'], 'forge.laravel.com' =>

在Codecanyon上的12个最佳PHP聊天脚本在Codecanyon上的12个最佳PHP聊天脚本Mar 13, 2025 pm 12:08 PM

您是否想为客户最紧迫的问题提供实时的即时解决方案? 实时聊天使您可以与客户进行实时对话,并立即解决他们的问题。它允许您为您的自定义提供更快的服务

Laravel中的通知Laravel中的通知Mar 04, 2025 am 09:22 AM

在本文中,我们将在Laravel Web框架中探索通知系统。 Laravel中的通知系统使您可以通过不同渠道向用户发送通知。今天,我们将讨论您如何发送通知OV

解释PHP中晚期静态结合的概念。解释PHP中晚期静态结合的概念。Mar 21, 2025 pm 01:33 PM

文章讨论了PHP 5.3中引入的PHP中的晚期静态结合(LSB),从而允许静态方法的运行时分辨率调用以获得更灵活的继承。 LSB的实用应用和潜在的触摸

PHP记录:PHP日志分析的最佳实践PHP记录:PHP日志分析的最佳实践Mar 10, 2025 pm 02:32 PM

PHP日志记录对于监视和调试Web应用程序以及捕获关键事件,错误和运行时行为至关重要。它为系统性能提供了宝贵的见解,有助于识别问题并支持更快的故障排除

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

仓库:如何复兴队友
1 个月前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.能量晶体解释及其做什么(黄色晶体)
2 周前By尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
1 个月前By尊渡假赌尊渡假赌尊渡假赌

热工具

EditPlus 中文破解版

EditPlus 中文破解版

体积小,语法高亮,不支持代码提示功能

螳螂BT

螳螂BT

Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

安全考试浏览器

安全考试浏览器

Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )专业的PHP集成开发工具