Является ли этот дизайн поставщика услуг приемлемым в Laravel? - PullRequest
0 голосов
/ 02 октября 2018

У меня есть следующие объекты: Event, Ticket.Я хочу получить информацию о билетах на последнее событие, используя разные источники данных.

Так что в моем контроллере я использую DI:

private $latestEventService;

public function __construct()
{
    $this->latestEventService= new LatestEventService();
}

и внутренние методы:

$this->latestEventService->getTicketsAmount();

app/Services/LatestEventService:

private $provider;

public function __construct($provider = 'db')
{
    $this->provider = new config('services.latest_event_providers')[$provider]();
}

public function getTicketsAmount()
{
    return $this->provider->getTicketsAmount();
}

public function getFreeTicketsAmount()
{
    return $this->provider->getFreeTicketsAmount();
}

public function getDiscountedTicketsAmount()
{
    return $this->provider->getDiscountedTicketsAmount();
}

config/services:

'latest_event_providers' => [
    'db' => '\App\Providers\LatestEvent\DBProvider',
    'api'=> '\App\Providers\LatestEvent\APIProvider'
]

DBProvider:

class DBProvider extends ServiceProvider implements ILatestEventProvider
{
    public function getTicketsAmount()
    {
        //fetch from db
    }

    public function getFreeTicketsAmount()
    {
        //fetch from db
    }

    public function getDiscountedTicketsAmount()
    {
        //fetch from db
    }
}

app/Interfaces/ILatestEventProvider:

interface ILatestEventProvider
{
    public function getTicketsAmount();

    public function getFreeTicketsAmount();

    public function getDiscountedTicketsAmount();
}

Могу ли я оставить все как есть?Я беспокоюсь о DBProvider, он не знаком другим провайдерам Laravel по умолчанию (нет методов по умолчанию boot() и register()).

1 Ответ

0 голосов
/ 02 октября 2018

Сервис-провайдер в Laravel - это место, где вы загружаете свое приложение.DBProvider не поставщик услуг, это просто калькулятор билетов на последнее событие (просто услуга)

Правильный DI в вашем контроллере будет

private $latestEvent;

public function __construct(LatestEventFactory $latestEventFactory, $provider)
{
    $this->latestEvent = $latestEventFactory->createInstance($provider);
}

Для создания сервиса LastEvent мы используем шаблон Factory Design

class LastEventFactory
{
    public function createInstance($provider): ILatestEvent
    {
        return new config('services.latest_event_providers')[$provider]();
    }
}

Далее необходимо создать два класса, которые реализуют ILatestEvent (DBLastEvent и ApiLastEvent)

interface ILatestEvent
{
    public function getTicketsAmount();

    public function getFreeTicketsAmount();

    public function getDiscountedTicketsAmount();
}

В этом случае вам не нужен поставщик услуг, потому что контейнер службы Laravel достаточно умен, чтобы разрешитьLatestEventFactory без поставщика услуг

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...