Laravel是否可以接受此服务提供商的设计?

时间:2018-10-02 15:47:52

标签: php oop laravel-5.5

我还有下一个实体:EventTicket。我想使用不同的数据源获取一些有关最新活动的门票信息。

因此在我的控制器中,我使用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 :(得分:1)

Laravel中的服务提供商是您引导应用程序的地方。 DBProvider不是服务提供商,它只是最新事件的票证计算器(仅用于服务)

控制器中的右DI将为

private $latestEvent;

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

我们使用Factory设计模式来创建LastEvent服务

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