symfony4 symfony3 service Создание собственного сервиса. Пример
Primary tabs
Рассматриваемые вопросы
- как создать собственный Сервис. На примере класса MailSender() (отправляет email-ы с обратной связью администратору сайта)
- как передать параметры в Сервис из конфигураций
Пример Symfony4
В Symfony4 подключена автозагрузка сервисов. Это значит, что не нужно отдельно описывать свой сервис в services.yaml, а можно сразу получить любой сервис (а также, контроллер или репозиторий, т.к. они тоже являются сервисами в Symfony4) в аргументах любого метода.
Хорошая практика - объявлять сервис в качестве аргумента конструктора класса, в котором хочешь использовать сервис, а не обращаться к нему в каждом методе отдельно, т.к. это повторяющийся код. А ещё, это может быть ооочень объёмный код, при масштабировании проекта.
- Как выглядит класс сервиса:
Создаём класс в директории App\Service<?php namespace App\Service; class MyService { public function serviceMethodWichDoSmth(): void { // здесь логика вашего сервиса, обычно сервис делает какие-то конкретные действия // например, отправка письма, подсчёт чего-то, получение данных, изменение данных } }
- Как выглядит использование сервиса:
Создаём класс в директории 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
- Создаём класс в директории 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); } }
- Настраиваем конфигурации в services.yml (нужно создать этот файл прямо внутри вашего бандла)
mail.sender: class: AppBundle\Service\MailSender: arguments: $adminEmail: admin_email_mail.ru
Аргумент можно принять в контроллере сервиса в качестве параметра
- Вызываем описанный метод в контроллере
$this->get('mail.sender')->sendFeedback($form->getData());
Всё)
Источники
- Log in to post comments
- 4106 reads