php - 我怎样才能更好地理解 php 中 symfony2 中的服务层

标签 php symfony

我正在学习使用 symfony2,但我很难了解什么是服务层以及它可以在哪里使用。

我怎样才能更好地理解 symfony2 中的服务层

最佳答案

我会尽力解释服务,但是 Symfony2 docs做得比我能做的更好。

服务的核心就是一个类。当一个类注册到 Symfony2 的 Dependency Injection Container(或简称为 Container)时,它就变成了一个服务。此时,该类是应用程序服务层的一部分。

服务可能具有依赖性(通常情况下确实如此),但这不是必需的。服务通常用作其他服务的依赖项。让我举个例子:

  • 您有一个用于发送电子邮件的类,名为 EmailSender
  • 您有一个包含有关如何通过 SMTP 发送电子邮件的说明的类,名为 SmtpTransport
  • EmailSender 具有 SmtpTransport 形式的依赖项。换句话说,要使 EmailSender 能够完成其工作,它需要将 SmtpTransport 实例注入(inject)其中。 (请注意,虽然 EmailSender 具有依赖性,但 SmtpTransport 没有。)

假设您需要在应用程序的五个不同位置使用 EmailSender。在每个地方,你可能有这样的代码:

$emailSender = new EmailSender(new SmtpTransport());  
$emailSender->send($email)

这不是很多代码(因为 EmailSender 只有一个依赖项),但是当您决定 EmailSender 应该使用传输类而不是使用 SMTP 时会发生什么发送邮件?您必须编辑每个代码块才能对其进行更新。

另一种方法是将 EmailSender 及其依赖项注册为服务。
注册看起来像这样:

// YourApp/YourBundle/Resources/config/services.yml
services:
  smtp_transport:
    class: YourApp\YourBundle\Email\SmtpTransport

  email_sender:
    class: YourApp\YourBundle\Email\EmailSender
    arguments:
      - @smtp_transport

现在,要使用它(从 container 感知上下文):

$container->get('email_sender')->send($email);

注意实际使用该类发送电子邮件是多么简单和清晰吗?当然,您必须先完成注册服务的工作,但这很简单,只需完成一次。

假设 EmailSender 具有三个依赖项,而不是一个。通过使用服务,您只需要修改服务注册,而无需更改您的实现代码(用于发送电子邮件的代码)。

简而言之,服务层充当类的中央存储库,这些类 a) 具有一个或多个依赖项 b) 需要在“全局”范围内使用。通过从 Dependency Injection Container 中获取这些服务类,您最终可以减少冗余代码并更轻松地进行广泛的更改。

我可能错了,但我认为 Symfony2 是第一个实现依赖注入(inject)容器的 PHP 框架。因此,许多 PHP 开发人员可能不熟悉服务的概念。我绝对建议确保您完全理解它,因为您会发现它是一个非常强大的工具。此外,服务的概念绝不仅限于 Symfony2 甚至 PHP——您将能够在各种框架和语言中利用这一概念。

关于php - 我怎样才能更好地理解 php 中 symfony2 中的服务层,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11407543/

相关文章:

symfony - 使用 for 循环表示 Twig 中的变量

mysql - 解释 Symfony 的 ACL 架构

php - Symfony 2.4 - 重复表单字段 - 当值不匹配时,如何将违规映射到第二个字段?

javascript - 如果选择了特定的选择选项值,则显示 div

php - 站点根目录的 Symfony 访问控制

php - Google BarChart 小数值不出现

php - Symfony2 中的 Oauth2

php - 通过PHPMailer发送邮件

php - 如何使用市场多供应商扩展在 magento 中的销售订单网格中自定义列

php - Symfony 查找器 : Finding all directories except ones that start with an underscore