Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 这种服务提供商的设计在Laravel是否可以接受?_Php_Oop_Laravel 5.5 - Fatal编程技术网

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=//您在这里的逻辑是您定义要使用哪个服务的逻辑。若它取决于控制器参数,那个么我们不需要服务提供者。我更新了我的答案