Service layer - это паттерн разработки программного обеспечения, который предлагает выделить логику, связанную с бизнес-процессами, в отдельный слой, отделяя ее от слоя контроллеров. Это помогает сделать контроллеры более тонкими и отвечать только за обработку входящих запросов и передачу данных между пользовательским интерфейсом и бизнес-логикой.
В Symfony можно успешно применять паттерн Service layer с использованием сервисов. В Symfony сервис - это класс, предоставляющий конкретный функционал, который может быть использован в различных частях приложения.
Вот пример, показывающий, как использовать Service layer и создать тонкие контроллеры в Symfony:
1. Создайте класс сервиса, предоставляющий бизнес-логику. Например, может быть сервис, отвечающий за отправку электронной почты:
namespace AppService; class EmailService { public function sendEmail($to, $subject, $body) { // Ваш код для отправки электронной почты } }
2. Зарегистрируйте сервис в файле services.yaml
или используйте аннотации в соответствующем классе контроллера:
services: AppServiceEmailService: public: true
3. Создайте контроллер и внедрите сервис в его конструктор:
namespace AppController; use AppServiceEmailService; use SymfonyComponentHttpFoundationRequest; use SymfonyComponentHttpFoundationResponse; use SymfonyComponentRoutingAnnotationRoute; class MyController { private $emailService; public function __construct(EmailService $emailService) { $this->emailService = $emailService; } /** * @Route("/send-email", methods={"POST"}) */ public function sendEmail(Request $request): Response { $data = json_decode($request->getContent(), true); $to = $data['to']; $subject = $data['subject']; $body = $data['body']; $this->emailService->sendEmail($to, $subject, $body); return new Response('Email sent', Response::HTTP_OK); } }
В контроллере MyController
мы внедрили сервис EmailService
и использовали его метод sendEmail
для отправки электронной почты.
Таким образом, бизнес-логика отправки электронной почты вынесена в отдельный сервис, а контроллер отвечает только за обработку запросов и взаимодействие с пользователями. Это позволяет сделать контроллеры более тонкими и улучшить инкапсуляцию кода.
Применение Service layer и использование сервисов в Symfony помогает создавать более модульные и расширяемые приложения, делает код более понятным и упрощает его тестирование.