[英]How can i better understand service layer in symfony2 in php
我正在学习使用symfony2,但我很难学习什么是服务层以及它可以在哪里使用。
我怎样才能更好地理解symfony2中的服务层
我会尽力解释服务,但Symfony2 文档比我能做得更好。
在它的核心,服务只是一个类。 当一个类在Symfony2的Dependency Injection Container
(或简称Container
)中注册时,它就成了一个服务。此时,该类是应用程序服务层的一部分。
服务可能具有依赖关系(通常,它确实存在),但并不是必需的。 服务通常用作其他服务的依赖项。 让我给你举个例子:
EmailSender
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关于这个主题的系列文章: 依赖注入 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.