我还有下一个实体: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()
方法)。
答案 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