Построить модель на основе драйверов в Laravel - PullRequest
2 голосов
/ 06 октября 2019

Я пытаюсь построить красноречивую модель «Платформы», которая может реализовать некоторую логику так же, как компоненты на основе драйверов.

Немного общего фона: у меня есть модель laravel под названием Платформы, в которой есть несколько общих методов. Но в зависимости от конкретной «платформы», я хотел бы создать несколько пользовательских методов, которые можно использовать только для этой конкретной платформы. Это может быть как метод подключения или похожий.

Таким образом, мой подход заключался в том, чтобы делать как компоненты на основе драйвера, которые расширяют Illuminate\Support\Manager, потому что мне нужен какой-то контракт на методы. И я хотел бы, чтобы методы были доступны, когда я загрузил конкретную «платформу».

Я знаю, что могу просто написать каждый метод в самой модели или включить как метод-дескриптор для каждой платформы. В итоге у меня будет около 10 платформ с 5-ю пользовательскими методами, так что все будет очень быстро.

Я бы предпочел не строить его как компонент, потому что мне нужны отношения с другими моделями.

Другой способ объяснить это может быть так: скажем, у вас есть группа пользователей, которые могут получать SMS-уведомления из приложения, пользователь может затем выбрать, какого SMS-провайдера использовать. (например, как Nexmo) Это будет class SMSProvider extends model, который имеет определенные методы, такие как send Таким образом, вы можете сделать $user->SMSProvider->send()

Этот метод отправки должен быть специфичным для конкретного поставщика, простокак в документации: https://laravel.com/docs/6.x/notifications#sms-notifications

Можете ли вы дать мне несколько советов о том, как я должен выглядеть или кодировать?

1 Ответ

1 голос
/ 15 октября 2019

Делая ответ, мне пришлось бы много думать о решении. Основа установлена, вам нужна модель платформы, предполагая, что у нее есть тип, указывающий поставщика.

/**
 * @property string type
 */
public class Platform extends Model
{
    ...
}

Драйверный подход в основном выполняется, если внешние люди должны расширять вашу библиотеку, и является своего рода инструментом управления для различныхреализации. Это не так, но я чувствую, что это сложнее, чем должно быть. Прямой подход должен связывать типы платформы с реализацией. Создайте интерфейс для реализации.

public interface SMSProvider
{
    public function sendSMS(): void;
}

Для реализации, реализации.

public class TeliaSMSProvider implements SMSProvider
{
    public function sendSms(): void
    {
        // magic
    }
}

В поставщике услуг своего приложения свяжите ввод с приложением.

$this->app->bind('telia', function ($app) {
    return new TeliaSMSProvider();
});

Опять же, эта обязательная часть является простым способом установить связь между типом и правильным экземпляром, вызовы драйвера или метода на основе параметра типа.

Теперь просто загрузите своего провайдера. с платформы, с типом в качестве ввода. Набор текста для удобства работы.

public class Platform extends Model
{
    public function getProvider(): SMSProvider
    {
        return app($this->type);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...