Есть ли хороший пример использования Service layer в Symfony, хотел бы увидеть тонкие контроллеры?

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 помогает создавать более модульные и расширяемые приложения, делает код более понятным и упрощает его тестирование.