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 или любой другой нужный класс в будущем.


Ответы (0 шт):