Как правильно построить архитектуру Laravel?

Создаю форму для отправки смс. Одна страница с инпутом и кнопкой где юзер вводит свой телефон и на него должно прийти SMS. На данный момент имею 2 контроллера и 2 сервиса(не сервис провайдер а просто класс который я обозвал сервисом). В сервисах я храню логику и через контроллеры вызываю функции из сервисов.

Проблема в том что запрос с формы приходит в MainController где генерятся новые данные, и вместе с номером записываются в бд. Но также есть SmsController который должен отправлять sms на номер. Этот номер приходит только в MainController. Вижу несколько решений но они мне не нравятся.

SmsController берет инфу из бд (Есть eloquent класс Connection который делают все работу с бд. ConnectionService создает экземпляр от Connection), но тут непонятно какой именно номер вытаскивать


Сделать 1 единственный контроллер куда пихать оба сервиса/либо тоже сделать только 1 сервис. Но я думаю что правильным считается 1 сервис на контроллер(или это не так?)

Код будет уродливым и все будет намешану в кучу.

Вызывать из одного контроллера метод другого.

Тоже не нравится. Так как выглядит убого( еще читал что это неочень хороший способ организации кода).

Создать трейт в котором будут функции, и сервисами их имплементить

У двух сервисов нет общих функций
  • Вопрос задан
  • 341 просмотр
Решения вопроса 1
@dpws
В сервисе создания сущности (по хорошему, называйте это UseCase. Сервисы - это про взаимодействие с инфраструктурой) кидайте событие PhoneAddedEvent, а в его слушателе отправляйте смс. Можно синхронно, можно через очереди.
Отдельный контроллер для отправки смс не нужен.
Если абстрагироваться от имплементации смс провайдера, то создайте сервис SmsSenderService implements SmsSenderInterface. Для отправки смс, в слушателе события PhoneAddedEvent, используйте SmsSenderInterface.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
Диспачьте новый Job в очередь в MainConttolleer на рассылку sms на нужный номер
Ответ написан
Комментировать
@Shady1010
Форма -> main controller -> model
View <- main controller <-^

Используйте сеттеры и геттеры , и не придется создавать 2 сервис. Ваш сервис-это модель , он имеет бизнес логику, для вашей задачи нет необходимости создавать второй сервис. Зачем усложнять , когда можно использовать сеттеры и геттеры.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы