Php 这种服务提供商的设计在Laravel是否可以接受?
我有下一个实体:Php 这种服务提供商的设计在Laravel是否可以接受?,php,oop,laravel-5.5,Php,Oop,Laravel 5.5,我有下一个实体:事件,票据。我想使用不同的数据源获取最新活动的票证信息 因此,在我的控制器中,我使用DI: private $latestEventService; public function __construct() { $this->latestEventService= new LatestEventService(); } 和内部方法: $this->latestEventService->getTicketsAmount() app/Services/Lates
事件
,票据
。我想使用不同的数据源获取最新活动的票证信息
因此,在我的控制器中,我使用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
}
}
interface ILatestEventProvider
{
public function getTicketsAmount();
public function getFreeTicketsAmount();
public function getDiscountedTicketsAmount();
}
app/Interfaces/ILatestEventProvider
:
class DBProvider extends ServiceProvider implements ILatestEventProvider
{
public function getTicketsAmount()
{
//fetch from db
}
public function getFreeTicketsAmount()
{
//fetch from db
}
public function getDiscountedTicketsAmount()
{
//fetch from db
}
}
interface ILatestEventProvider
{
public function getTicketsAmount();
public function getFreeTicketsAmount();
public function getDiscountedTicketsAmount();
}
我能保持原样吗?我担心的是DBProvider
,其他“默认”Laravel提供程序对它并不熟悉(没有“默认”boot()
和register()
方法)。Laravel中的服务提供程序是您引导应用程序的地方。DBProvider不是服务提供商,它只是最新事件的票证计算器(只是服务)
控制器中的DI将是正确的
private $latestEvent;
public function __construct(LatestEventFactory $latestEventFactory, $provider)
{
$this->latestEvent = $latestEventFactory->createInstance($provider);
}
为了创建LastEvent服务,我们使用Factory设计模式
class LastEventFactory
{
public function createInstance($provider): ILatestEvent
{
return new config('services.latest_event_providers')[$provider]();
}
}
接下来,您应该创建两个实现ILateTestEvent的类(DBLastEvent和ApiLastEvent)
在这种情况下,您不需要服务提供商,因为Laravel服务容器足够智能,可以在没有服务提供商的情况下解析LateStevenFactory“您应该创建两个实现ILateTestEvent的类”-您认为我可以将它们放在哪里?关于$provider=//您的逻辑
-我想,这里是定义eiter DB或API服务的地方,但在我的原始帖子中,我将其作为一个选项传递。现在,如何组织代码并不重要,使用现代IDE更改结构很容易。您可以添加服务namespace\App\Services\DBLastEvent,也可以将它们与您的模型放在一起。在这里,您可以为您的项目找到好主意$provider=//您在这里的逻辑是您定义要使用哪个服务的逻辑。若它取决于控制器参数,那个么我们不需要服务提供者。我更新了我的答案