laravel Динамическая реализация интерфейса
Имеется интерфейс SMSService , его реализует класс MegafonSMS Регистрация реализатора интерфейса происходит через сервис-провайдер
$this->app->singleton(SMSService::class, function ($app) {
return MegafonSMS::getInstance();
});
Как понятно из название - класс для работы\отправки смс через Мегафон. Возникла необходимость добавить еще 1 реализатор интерфейса - условный MtsSMS. Передо мной стоит задача в зависимости от передаваемого\получаемого номера выбирать нужный класс реализатор интерфейса. Но при текущей реализации - выбор класса-реализатора происходит до того, как будут получены данные(номер телефона).
Вопрос - как в данном случае лучше реализовать задачу? Я смотрю в сторону фасадов\контрактов.
Пример вызова функционала:
$smsStatus = $this->smsService->messageSend($phone, $userMessage);
И мне хотелось бы сохранить похожий принцип работы. Т.е. обращение к smsService и уже он подтягивает нужный обработчик.
Как я вижу текущий вариант реализации задачи - я пишу класс smsService Происходит вызов
smsService->messageSend($phone, $userMessage)
в самом классе такой код
...
public function checkPhone($phone) {
//код для обработки телефона и выбора оператора
return 'name';
}
public function messageSend($phone, $userMessage) {
$name = checkPhone($phone);
return $name->messageSend($phone, $userMessage);
}
Соответственно вместо $name будет MegafonSMS , MtsSMS или любой другой нужный класс в будущем.