4

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

我如何更好地理解 symfony2 中的服务层

4

2 回答 2

8

我会尽力解释服务,但 Symfony2文档做得比我能做的要好。

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

服务可能具有依赖关系(而且通常确实如此),但它不是必需的。服务通常用作其他服务的依赖项。让我给你举个例子:

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

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

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

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

另一种方法是将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 是第一个实现依赖注入容器的 PHP 框架。因此,很多 PHP 开发人员可能不熟悉服务的概念。我绝对建议您确保完全理解它,因为您会发现它是一个非常强大的工具。此外,服务的概念绝不限于 Symfony2 甚至 PHP——您将能够在各种框架和语言中利用这个概念。

于 2012-07-10T15:03:09.520 回答
1

试试 Fabien 关于这个主题的系列文章:依赖注入

于 2012-07-10T06:16:53.010 回答