Я учусь использовать 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 – вы сможете использовать эту концепцию в самых разных рамках и языках.
Попробуйте ряд статей Фабиена по теме: Инъекция зависимостей .