Я учусь использовать symfony2, но мне трудно найти, что такое уровень обслуживания и где его можно использовать.
Как лучше понять уровень сервиса в symfony2
Я попытаюсь изо всех сил объяснить услуги, но документы Symfony2 работают лучше, чем я.
В его основе сервис – это просто класс. Класс становится сервисом, когда он зарегистрирован в Dependency Injection Container
Symfony2 (или просто для Container
для краткости). В этот момент класс является частью уровня обслуживания приложения.
У службы могут быть зависимости (и часто это время), но это необязательно. Служба часто используется как зависимость для других служб. Позволь мне привести пример:
EmailSender
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 – вы сможете использовать эту концепцию в самых разных рамках и языках.
Попробуйте ряд статей Фабиена по теме: Инъекция зависимостей .