Как я могу лучше понять уровень сервиса в symfony2 в php

Я учусь использовать symfony2, но мне трудно найти, что такое уровень обслуживания и где его можно использовать.

Как лучше понять уровень сервиса в symfony2

Solutions Collecting From Web of "Как я могу лучше понять уровень сервиса в symfony2 в php"

Я попытаюсь изо всех сил объяснить услуги, но документы Symfony2 работают лучше, чем я.

В его основе сервис – это просто класс. Класс становится сервисом, когда он зарегистрирован в Dependency Injection Container Symfony2 (или просто для Container для краткости). В этот момент класс является частью уровня обслуживания приложения.

У службы могут быть зависимости (и часто это время), но это необязательно. Служба часто используется как зависимость для других служб. Позволь мне привести пример:

  • У вас есть класс, используемый для отправки электронной почты, называемый EmailSender
  • У вас есть класс, который содержит инструкции о том, как отправлять электронную почту через SMTP, называемый SmtpTransport
  • EmailSender имеет зависимость в виде SmtpTransport . Другими словами, для EmailSender чтобы EmailSender мог выполнять свою работу, ему нужен экземпляр SmtpTransport для его SmtpTransport . (Обратите внимание, что хотя у EmailSender есть зависимость, SmtpTransport этого не делает.)

Скажем, вам нужно использовать EmailSender в пяти разных местах вашего приложения. В каждом месте у вас может быть такой код:

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

Это не очень много кода (поскольку у EmailSender только одна зависимость), но что происходит, когда вы решаете, что вместо использования 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 – вы сможете использовать эту концепцию в самых разных рамках и языках.

Попробуйте ряд статей Фабиена по теме: Инъекция зависимостей .