返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >使用 Symfony 组件在 PHP 中进行依赖注入的示例
  • 347
分享到

使用 Symfony 组件在 PHP 中进行依赖注入的示例

2024-02-27 20:02:49 347人浏览 泡泡鱼
摘要

在本文中,我们将查看一些使用 Symfony DependencyInjection 组件的示例。 我们将学习依赖注入的基础知识,它允许干净和模块化的代码,我们将看到如何在带有 Symfony 组件的

在本文中,我们将查看一些使用 Symfony DependencyInjection 组件的示例。 我们将学习依赖注入的基础知识,它允许干净和模块化的代码,我们将看到如何在带有 Symfony 组件的 PHP 应用程序中使用它。


什么是 Symfony DependencyInjection 组件?

Symfony DependencyInjection 组件提供了一种标准方法来实例化对象并处理 php 应用程序中的依赖管理。 DependencyInjection 组件的核心是一个容器,它包含应用程序中所有可用的服务。

在应用程序的引导阶段,我们应该将应用程序中的所有服务注册到容器中。 在稍后阶段,容器负责根据需要创建服务。 更重要的是,容器还负责创建和注入服务的依赖项。

这种方法的好处是我们不必对实例化对象的过程进行硬编码,因为依赖项将被自动检测和注入。 这会在应用程序的各个部分之间造成松耦合。

在本文中,我们将探讨如何释放 DependencyInjection 组件的强大功能。 像往常一样,我们将从安装和配置说明开始,我们将实施一些真实世界的示例来演示关键概念。


安装和配置

在本节中,我们将继续安装 DependencyInjection 组件。 我假设大家已经在系统中安装了 Composer,因为我们需要它来安装 PackaGISt 提供的 DependencyInjection 组件。

因此,继续使用以下命令安装 DependencyInjection 组件。


$ composer require symfony/dependency-injection

那应该已经创建了 composer.json 文件,它应该如下所示:


{
    "require": {
        "symfony/dependency-injection": "^5.4"
    }
}

我们还将安装一些在我们的示例中有用的其他组件。

如果我们想从 YAML 文件加载服务而不是在 PHP 代码中定义它,那么 Yaml 组件可以帮上忙,因为它可以帮助我们将 YAML 字符串转换为 PHP 兼容的数据类型,反之亦然。


$ composer require symfony/yaml

最后,我们将安装 Config 组件,它提供了几个实用程序类来初始化和处理在不同类型的文件(如 YAML、INI 和 XML)中定义的配置值。 在我们的例子中,我们将使用它从 YAML 文件加载服务。


$ composer require symfony/config

让我们将 composer.json 文件修改为如下所示。


{
    "require": {
        "symfony/dependency-injection": "^5.4",
        "symfony/yaml": "^5.4",
        "symfony/config": "^5.4"
    },
    "autoload": {
         "psr-4": {
             "Services\\": "src"
         },
         "claSSMap": ["src"]
    }
}

由于我们添加了一个新的类映射条目,让我们继续运行以下命令来更新 composer 自动加载器。


$ composer dump -o

现在,我们可以使用服务命名空间自动加载 src 目录下的类。

这就是安装部分,但是我们应该如何使用它呢? 事实上,这只是将 Composer 创建的 autoload.php 文件包含在我们的应用程序中的问题,如以下代码段所示。


require_once './vendor/autoload.php';

如何使用容器

在本节中,我们将通过一个示例来演示如何将服务注入到容器中。 容器应充当中央存储库,其中包含应用程序中的所有服务。 稍后,我们可以根据需要使用容器来获取服务。

首先,让我们继续在 src/DemoService.php 中使用以下内容定义一个非常基本的服务。

src/DemoService.php


namespace Services;
 
class DemoService
{
  public function helloWorld()
  {
    return "Hello World!\n";
  }
}

这是一个非常简单的服务,暂时只是实现了 helloWorld 方法。

接下来,继续在应用程序的根目录中创建包含以下内容的 basic_container.php 文件。

basic_container.php


require_once './vendor/autoload.php';
use Symfony\Component\DependencyInjection\ContainerBuilder;
 
// init service container 
$containerBuilder = new ContainerBuilder();
 
// add service into the service container 
$containerBuilder->register('demo.service', '\Services\DemoService');
 
// fetch service from the service container 
$demoService = $containerBuilder->get('demo.service');
echo $demoService->helloWorld();

首先,我们使用 new ContainerBuilder() 构造函数实例化了 ContainerBuilder 对象。 接下来,我们使用 ContainerBuilder 对象的 register 方法将我们的自定义服务 \Services\DemoService 注入到容器中。 demo.service 充当我们服务的别名。

最后,我们使用了 ContainerBuilder 对象的 get 方法从容器中获取我们的服务并使用它来调用 helloWorld 方法。

所以这是如何使用容器的基本演示。 在下一节中,我们将扩展此示例以探索如何使用容器解决类依赖关系。


一个真实的例子

在本节中,我们将创建一个示例来演示如何使用 DependencyInjection 组件解析类依赖项。

为了演示它,我们将创建一个新服务 DependentService,它需要在上一节中创建的 DemoService 服务作为依赖项。 因此,我们将看到 DemoService 服务如何在 DependentService 服务实例化时作为依赖自动注入。

继续使用以下内容创建 src/DependentService.php 文件来定义 DependentService 服务。

src/DependentService.php


namespace Services;
 
class DependentService
{
  private $demo_service;
 
  public function __construct(\Services\DemoService $demoService)
  {
    $this->demo_service = $demoService;
  }
 
  public function helloWorld()
  {
    return $this->demo_service->helloWorld();
  }
}

如大家所见,需要 \Services\DemoService 服务才能实例化 DependentService 服务。

接下来,继续创建包含以下内容的 di_container.php 文件。

di_container.php


require_once './vendor/autoload.php';
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Reference;
 
// init service container 
$containerBuilder = new ContainerBuilder();
 
// add demo service into the service container 
$containerBuilder->register('demo.service', '\Services\DemoService');
 
// add dependent service into the service container 
$containerBuilder->register('dependent.service', '\Services\DependentService')
                 ->addArgument(new Reference('demo.service'));
 
// fetch service from the service container 
$dependentService = $containerBuilder->get('dependent.service');
echo $dependentService->helloWorld();

我们使用相同的注册方法将我们的自定义服务 \Services\DependentService 注入到容器中。

除此之外,我们还使用了 addArgument 方法来通知容器有关 DependentService 服务的依赖性。 我们使用 Reference 类来通知容器它需要在 dependent.service 服务实例化时注入 demo.service 服务。 这样,一个依赖项就会根据需要自动注入!

最后,我们使用 ContainerBuilder 对象的 get 方法从 ContainerBuilder 对象中获取 dependent.service 服务,并使用它调用 helloWorld 方法。

通过这种方式,DependencyInjection 组件提供了一种标准方法来实例化对象并在我们的应用程序中注入依赖项。


如何使用 YAML 文件动态加载服务

在本节中,我们将探讨如何从 YAML 文件动态加载服务。 基本上,我们将更新上一节中讨论的示例。

除了 DependencyInjection 组件之外,我们还需要另外两个 Symfony 组件来实现 YAML 示例——Config 和 Yaml。 回想一下,我们已经在安装和配置部分安装了这两个组件以及 DependencyInjection 组件本身。 所以我们可以开始了!

继续并在应用程序的根目录中创建包含以下内容的 services.yaml 文件。

services.yaml


services:
    demo.service:
        class:     \Services\DemoService
    dependent.service:
        class:     \Services\DependentService
        arguments: ["@demo.service"]

如大家所见,使用 YAML 语法定义服务非常简单。 要定义服务的依赖项,您需要使用参数键。

接下来,继续创建包含以下内容的 di_yaml_container.php 文件。

di_yaml_container.php


require_once './vendor/autoload.php';
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\Config\FileLocator;
use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;
 
// init service container 
$containerBuilder = new ContainerBuilder();
 
// init yaml file loader 
$loader = new YamlFileLoader($containerBuilder, new FileLocator(__DIR__));
 
// load services from the yaml file 
$loader->load('services.yaml');
 
// fetch service from the service container 
$serviceOne = $containerBuilder->get('dependent.service');
echo $serviceOne->helloWorld();

除了我们从 services.yaml 文件加载服务而不是在 PHP 代码本身中定义服务外,一切都几乎相同。 这允许动态定义应用程序依赖性。


如何注入惰性服务

在某些情况下,我们想注入惰性服务。 有时,我们有一个实例化起来非常繁重的服务。 所以你只希望在真正需要的时候注入这样的服务,而不是在那之前。 这个问题的答案是惰性服务。

但这究竟是如何工作的呢? 事实上,当我们配置惰性服务时,并没有注入实际的服务,而是注入了服务的代理。 从表面上看,代理服务就像实际服务一样,但是一旦您开始与代理服务交互,实际服务就会被实例化。

要使用惰性服务,我们需要安装 symfony/proxy-manager-bridge 包。 让我们首先这样做。


$ composer require symfony/proxy-manager-bridge

接下来,我们将修改 di_container.php 示例以了解如何使用代理管理器来创建和注入代理服务。

继续将 di_container.php 文件的代码替换为以下内容。

di_container.php


require_once './vendor/autoload.php';
use ProxyManager\Factory\LazyLoadingValueHolderFactory;
use ProxyManager\Proxy\LazyLoadingInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;
// code for creating proxy starts 
$factory     = new LazyLoadingValueHolderFactory();
$initializer = function (& $wrappedObject, LazyLoadingInterface $proxy, $method, array $parameters, & $initializer) {
    global $containerBuilder;
    $initializer   = null; // disable initialization 
    $wrappedObject = $containerBuilder->get('demo.service'); // fill your object with values here 
    return true; // confirm that initialization occurred correctly 
};
$proxy = $factory->createProxy('\Services\DemoService', $initializer);
// code for creating proxy ends 
global $containerBuilder;
$containerBuilder = new ContainerBuilder();
$containerBuilder->register('demo.service', '\Services\DemoService');
$containerBuilder->register('dependent.service', '\Services\DependentService')->addArgument($proxy);
$dependentService = $containerBuilder->get('dependent.service');
echo $dependentService->helloWorld();

首先,我们创建了 LazyLoadingValueHolderFactory 类的一个实例。 接下来,我们使用了此类的 createProxy 方法来定义如何创建 \Services\DemoService 类的实例。 createProxy 方法的第二个参数是一个匿名函数,当需要实例化类的实际实例而不是代理对象时将调用该函数。 因此,匿名函数处理创建实际实例的逻辑。

除此之外,它几乎是一样的。 创建代理实例后,我们将在 addArgument 方法中传递它,而不是使用 Reference 类创建实例。

这种方法的好处是,每当我们创建 \Services\DependentService 类的实例时,它不会创建 \Services\DemoService 类的实际对象,而是创建一个代理对象。 \Services\DemoService 类的实际对象只有在您调用它的任何方法时才会创建。

为了确认这一点,我们可以转储 $dependentService 对象,我们应该会看到类似这样的内容。


Services\DependentService Object
(
    [demo_service:Services\DependentService:private] => ProxyManagerGeneratedProxy\__PM__\Services\DemoService\Generatedccdf8241e892da36c12500ed72d82829 Object
        (
            [valueHoldera1fd8:ProxyManagerGeneratedProxy\__PM__\Services\DemoService\Generatedccdf8241e892da36c12500ed72d82829:private] => 
            [initializere3996:ProxyManagerGeneratedProxy\__PM__\Services\DemoService\Generatedccdf8241e892da36c12500ed72d82829:private] => Closure Object
                (
                    [parameter] => Array
                        (
                            [&$wrappedObject] => <required>
                            [$proxy] => <required>
                            [$method] => <required>
                            [$parameters] => <required>
                            [&$initializer] => <required>
                        )
                )
        )
)

如大家所见,它创建了代理对象而不是实际的 \Services\DemoService 对象。

如果你没有使用代理方法,输出会是这样的。


Services\DependentService Object
(
    [demo_service:Services\DependentService:private] => Services\DemoService Object
        (
        )
)

如大家所见,它创建了 \Services\DemoService 类的一个实例。 这就是延迟加载服务的工作原理!


结论

Symfony DependencyInjection 组件在本教程中占据了中心位置。 我们看到了如何安装和配置 DependencyInjection,以及一些如何使用它的真实示例。

我真的对 Symfony 框架的解耦组件感到着迷和兴奋,我们可以为应用程序挑选和选择这些组件。 将它们插入我们的代码,它们就可以正常工作! 总而言之,我只能看到这种框架方法对我们的 PHP 社区的好处。

--结束END--

本文标题: 使用 Symfony 组件在 PHP 中进行依赖注入的示例

本文链接: https://lsjlt.com/news/568906.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 使用 Symfony 组件在 PHP 中进行依赖注入的示例
    在本文中,我们将查看一些使用 Symfony DependencyInjection 组件的示例。 我们将学习依赖注入的基础知识,它允许干净和模块化的代码,我们将看到如何在带有 Symfony 组件的 ...
    99+
    2024-02-27
  • Angular4依赖注入之组件服务注入的示例分析
    这篇文章将为大家详细讲解有关Angular4依赖注入之组件服务注入的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。开发环境及开发语言:Angular 4 +Ang...
    99+
    2024-04-02
  • Vue中依赖注入的示例分析
    这篇文章主要介绍了Vue中依赖注入的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。简单粗暴型:<el-select ...
    99+
    2024-04-02
  • Angular中依赖注入的示例分析
    这篇文章主要介绍Angular中依赖注入的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!依赖注入:设计模式依赖:程序里需要的某种类型的对象。依赖注入框架:工程化的框架注入器Injector:用它的API创建依...
    99+
    2023-06-06
  • Vue 2.0中依赖注入provide/inject组合的示例分析
    这篇文章主要介绍Vue 2.0中依赖注入provide/inject组合的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!用法-------------------------...
    99+
    2024-04-02
  • ASP.NETCoreMVC在视图中使用依赖注入
    ASP.NET Core 支持在试图中使用依赖注入。这将有助于提供视图专用的服务,比如本地化或者仅用于填充视图元素的数据。应尽量保持控制器和视图之间的关注点分离。视图所显示的大部分数...
    99+
    2024-04-02
  • php如何使用Symfony Route组件进行URL路由?
    随着互联网技术的不断发展,Web应用程序成为了当今互联网世界的重要组成部分。在Web应用程序开发过程中,URL路由是一个非常重要的概念。正确的URL路由设计可以对SEO优化、网站性能以...
    99+
    2024-04-02
  • Angular6中服务和依赖注入的示例分析
    这篇文章主要介绍Angular6中服务和依赖注入的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!在开发中,组件一般用来写视图有关的功能,服务则写一些其他的逻辑,诸如从服务器获...
    99+
    2024-04-02
  • php中如何使用laravel实现依赖注入
    这篇文章主要介绍“php中如何使用laravel实现依赖注入”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“php中如何使用laravel实现依赖注入”文章能帮助大家解决问题。laravel容器包含控...
    99+
    2023-07-04
  • 在ASP.Net Web Forms中使用依赖注入的步骤
    目录创建 WebForm 项目创建实体 和 接口创建容器和类型注册WebForms 使用依赖注入依赖注入技术就是将一个对象注入到一个需要它的对象中,同时它也是控制反转的一种实现,显而...
    99+
    2024-04-02
  • 聊聊Vue3中的依赖注入与组件定义
    本次主要分享Vue3中依赖注入以及组件定义相关的几个API,以及在常用库ElementUI Plus和Vueuse中的使用情况,通过示例来理解使用场景。让我们聊聊 Vue 3中依赖注入与组件定义相关的那点事儿。provide() &...
    99+
    2023-05-14
    Vue vue3
  • Angular中的依赖注入如何使用
    这篇文章主要介绍了Angular中的依赖注入如何使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Angular中的依赖注入如何使用文章都会有所收获,下面我们一起来看看吧。译者添加:维基百科中指出 -- 在软件...
    99+
    2023-07-04
  • php如何使用Symfony Translation组件进行多语言支持?
    Symfony Translation组件是一个强大的工具,可用于简化多语言站点的开发。在本文中,我们将介绍如何使用PHP和Symfony Translation组件来实现一个多语言网...
    99+
    2024-04-02
  • AngularJS中模块化和依赖注入的示例分析
    这篇文章主要介绍了AngularJS中模块化和依赖注入的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。 ...
    99+
    2024-04-02
  • Laravel框架中依赖注入功能的示例分析
    这篇文章将为大家详细讲解有关Laravel框架中依赖注入功能的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。概述任何时候,你在一个控制器类中请求一个依赖,这个服务容器负责:自动地在构造函数中检测依...
    99+
    2023-06-15
  • 使用 Symfony 缓存组件在 PHP 中设置缓存
    今天,我将向各位展示 Symfony 缓存组件,这是一种向 PHP 应用程序添加缓存的简单方法。 这有助于通过减少页面加载时间来提高应用程序的整体性能。 Symfony 缓存组件 Symfon...
    99+
    2024-02-27
  • 如何理解Angular中的组件通讯和依赖注入
    这篇文章给大家介绍如何理解Angular中的组件通讯和依赖注入,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。 Angular组件间怎么进行通讯?依赖注入是什...
    99+
    2024-04-02
  • Vue3中的依赖注入与组件定义怎么实现
    本篇内容主要讲解“Vue3中的依赖注入与组件定义怎么实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Vue3中的依赖注入与组件定义怎么实现”吧!provide() & inject()...
    99+
    2023-07-05
  • 在vue中使用screenfull 依赖,实现全屏组件方式
    目录vue使用screenfull依赖,实现全屏组件vue使用Screenfull全屏切换总结vue使用screenfull依赖,实现全屏组件 需求:将页面全屏化,实现按F11全屏的...
    99+
    2022-12-09
    vue使用screenfull依赖 全屏组件 vue全屏组件
  • PHP中的Spring容器如何实现数组和容器的依赖注入?
    在PHP中,依赖注入是一种常见的实现方式,常用于解决对象之间的依赖关系。Spring容器是一个非常强大的依赖注入框架,它提供了一种灵活的方式来注入对象之间的依赖关系。在本文中,我们将介绍如何在PHP中使用Spring容器实现数组和容器的依...
    99+
    2023-06-19
    spring 数组 容器
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作