首页 > 解决方案 > 挣扎于 PHP 策略模式和接口继承

问题描述

Laravel 5.4 PHP 应用程序在这里。

我需要策略来使用不同的算法来根据数据的来源在学校招收学生。

2 个数据提供者有两个端点。

这是命中控制器方法的正常路由。

<?php

class WebhookController 
{
    public function endpointDataProvider1(FormRequestData1 $request)
    {
        // some particular logic
        $this->enrollmentService->enroll($request)
    }

    public function endpointDataProvider2(FormRequestData2 $request) 
    {
        // some particular logic
        $this->enrollmentService->enroll($request)
    }
}

此方法注入 2 个不同的表单请求,因为数据可能因提供者而异。

<?php

class FormRequestData1 implements Data1
{
    public function rules() 
    {
        return [];
    }
    public function getFirstName() {}
    public function getLastName() {}
    public function getProvider() {}
    public function getSomeParticularRandomData() {}

}

class FormRequestData2 implements Data2
{
    public function rules() 
    {
        return [];
    }

    public function getFirstName() {}
    public function getLastName() {}
    public function getProvider() {}
    public function getOtherParticularRandomData() {}
}

此表单请求根据数据提供者实现具有不同 getter 的接口。


<?php

interface Data
{
    public function getFirstName();
    public function getLastName();
    public function getProvider();
}

interface Data1 extends Data
{
    public function getSomeParticularRandomData();
}


interface Data2 extends Data
{
    public function getOtherParticularRandomData();

}

控制器方法调用 EnrollmentService,它通过工厂决定使用哪种策略,具体取决于哪个数据提供者进行调用。

<?php

class EnrollmentService
{
    public function enroll(Data $data) 
    {
        $strategy = $this->enrollmentStrategyFactory->make($data->getProvider());
        $strategy->enroll($data);
    }
}

和策略:

<?php
abstract class EnrollmentStrategy
{
    public abstract function enroll(Data $data);
}
class Provider1EnrollmentStrategy extends EnrollmentStrategy 
{
    public abstract function enroll(Data1 $data);
}
class Provider2EnrollmentStrategy extends EnrollmentStrategy 
{
    public abstract function enroll(Data2 $data);
}

我的问题是在这里我应该得到一个错误。因为即使是interfacesData1Data2extends interface Data,子策略都是实现的Data1Data2而它的父策略是实现父接口的Data

如果我Data在任何地方都输入提示,我会失去一致性,因为我应该确保在任何对应的地方都有可用 getSomeParticularRandomDatagetOtherParticularRandomData方法。

这更像是一个设计问题。

欢迎任何形式的建议,我希望我没有把这些例子弄得一团糟。

谢谢

标签: phplaravelstrategy-pattern

解决方案


推荐阅读