我正在学习使用symfony2,但我很难学习什么是服务层以及它可以在哪里使用。
如何更好地理解symfony2中的服务层
尽力解释服务,但 Symfony2 文档做得比我能做的要好。
从本质上讲,服务只是一个类。当一个类在Symfony2的Dependency Injection Container
(或简称Container
(注册时,它就变成了一个服务。此时,该类是应用程序服务层的一部分。
服务可能有依赖项(通常确实如此(,但不是必需的。服务通常用作其他服务的依赖项。我举个例子:
- 您有一个用于发送电子邮件的类,称为
EmailSender
- 您有一个类,其中包含有关如何通过 SMTP 发送电子邮件的说明,称为
SmtpTransport
-
EmailSender
具有SmtpTransport
形式的依赖关系。换句话说,为了使EmailSender
能够完成其工作,它需要一个SmtpTransport
实例注入其中。(请注意,尽管EmailSender
具有依赖项,但SmtpTransport
没有依赖项。
假设您需要在应用中的五个不同位置使用EmailSender
。在每个位置,您可能有如下代码:
$emailSender = new EmailSender(new SmtpTransport());
$emailSender->send($email)
这不是很多代码(因为EmailSender
只有一个依赖项(,但是当您决定不使用 SMTP 而不是使用 SMTP 时会发生什么EmailSender
应该使用 传输类进行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 - 您将能够在各种框架和语言中利用这一概念。
试试Fabien关于这个主题的系列文章:依赖注入。