symfony4 symfony3 service Создание собственного сервиса. Пример

Рассматриваемые вопросы

  • как создать собственный Сервис. На примере класса MailSender() (отправляет email-ы с обратной связью администратору сайта)
  • как передать параметры в Сервис из конфигураций

Пример Symfony4

В Symfony4 подключена автозагрузка сервисов. Это значит, что не нужно отдельно описывать свой сервис в services.yaml, а можно сразу получить любой сервис (а также, контроллер или репозиторий, т.к. они тоже являются сервисами в Symfony4) в аргументах любого метода.

Хорошая практика - объявлять сервис в качестве аргумента конструктора класса, в котором хочешь использовать сервис, а не обращаться к нему в каждом методе отдельно, т.к. это повторяющийся код. А ещё, это может быть ооочень объёмный код, при масштабировании проекта.

  1. Как выглядит класс сервиса:
    Создаём класс в директории App\Service
    <?php
    
    namespace App\Service;
    
    class MyService
    {
        public function serviceMethodWichDoSmth(): void
        {
            // здесь логика вашего сервиса, обычно сервис делает какие-то конкретные действия
            // например, отправка письма, подсчёт чего-то, получение данных, изменение данных
        }
    }
  2. Как выглядит использование сервиса:
    Создаём класс в директории App\Controller
    <?php
    
    namespace App\Controller;
    
    use MyService;
    
    class MyController
    {
        /**
         * @var MyService
         */
        private $myService;
        
        // Сервис автозагрузится в качестве аргумента по имени класса (MyService)
        public function __construct(MyService $myService) 
        {
            // Помещаем сервис в поле класса
            $this->myService = $myService;
        }
    
        public function action(): void
        {
            // используем сервис, который находится в поле нашего класса
            $this->myService->serviceMethodWichDoSmth();
        }
    }

Всё, дополнительно конфигурировать ничего не надо, пользуемся)

Пример Symfony3

  1. Создаём класс в директории AppBundle\Service
    Как установить и настроить SwiftmailerBundle можно прочитать здесь.
    <?php
    
    namespace AppBundle\Service;
    
    // Используем SwiftmailerBundle непосредственно для отправки сообщений
    use Swift_Mailer;
    use Swift_Message;
    use Twig_Environment;
    
    class MailSender
    {
        /**
         * @var string
         */
        private $adminEmail;
        
        /**
         * @var Swift_Mailer
         */
        private $mailer;
        
        public function __construct(Swift_Mailer $mailer, Twig_Environment $twig, string $adminEmail) 
        {
           // это argument, который можно указать в конфигурации сервиса (см. ниже)
            $this->adminEmail = $adminEmail;
           // это объект-отправщик сообщений
            $this->mailer = $mailer;
           // это объект-шаблон(т.к. мы не в контроллере, он будет вызывать метод render)
            $this->twig = $twig;
        }
        
        /**
         * @param array $userFeedbackData
         */
        public function sendFeedback(array $userFeedbackData): void
        {
            $message = (new Swift_Message('Feedback Email'))
                ->setFrom('tehnic_email_mail.ru')
                ->setTo($this->adminEmail)
                ->setBody(
                    $this->twig->render(
                        'feedback/feedback_email.html.twig', [
                            'name' => $userFeedbackData['name'],
                            'phone' => $userFeedbackData['phone'],
                            'message' => $userFeedbackData['message'],
                    ]),
                    'text/html');
            
            $this->mailer->send($message);
        }
    }
  2. Настраиваем конфигурации в services.yml (нужно создать этот файл прямо внутри вашего бандла)
        
    mail.sender:
        class: AppBundle\Service\MailSender:
        arguments:
            $adminEmail: admin_email_mail.ru

    Аргумент можно принять в контроллере сервиса в качестве параметра

  3. Вызываем описанный метод в контроллере
    $this->get('mail.sender')->sendFeedback($form->getData());

Всё)

Источники

http://symfony.com/doc/current/service_c...