我会尽力解释服务,但Symfony2 文档比我能做得更好.
在它的核心,服务只是一个类.当一个类在Symfony2中注册时Dependency Injection Container(或者只是Container简称),它就成为一种服务.此时,该类是应用程序服务层的一部分.
服务可能具有依赖关系(通常,它确实存在),但并不是必需的.服务通常用作其他服务的依赖项.让我给你举个例子:
EmailSenderSmtpTransportEmailSender有一种依赖的形式SmtpTransport.换句话说,为了EmailSender能够完成它的工作,它需要一个SmtpTransport被注入其中的实例.(注意虽然EmailSender有依赖性,但是SmtpTransport没有.)假设您需要在应用EmailSender中的五个不同位置使用.在每个位置,您可能有这样的代码:
$emailSender = new EmailSender(new SmtpTransport());
$emailSender->send($email)
Run Code Online (Sandbox Code Playgroud)
这不是很多代码(因为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
Run Code Online (Sandbox Code Playgroud)
现在,使用它(来自可container识别的上下文):
$container->get('email_sender')->send($email);
Run Code Online (Sandbox Code Playgroud)
请注意实际使用该类发送电子邮件有多简单和清晰?当然,你必须先完成注册服务的工作,但这是微不足道的,只需要做一次.
想象一下,EmailSender有三个依赖,而不是一个.通过使用服务,您只需修改服务注册,而无需更改实施代码(用于发送电子邮件的代码).
简而言之,服务层充当类的中央存储库,a)具有一个或多个依赖关系b)需要在"全局"范围中使用.通过从中获取这些服务类Dependency Injection Container,您最终可以获得更少的冗余代码,并且可以更轻松地进行广泛的更改.
我可能错了,但我认为Symfony2是第一个实现依赖注入容器的PHP框架.因此,许多PHP开发人员可能不熟悉服务的概念.我绝对建议您确保完全理解它,因为您会发现它是一个非常强大的工具.此外,服务的概念绝不仅限于Symfony2甚至PHP - 您将能够在各种框架和语言中利用这一概念.
| 归档时间: |
|
| 查看次数: |
1568 次 |
| 最近记录: |