php - 挣扎于 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);
}
我的问题是在这里我应该得到一个错误。因为即使是interfacesData1
和Data2
extends interface Data
,子策略都是实现的Data1
,Data2
而它的父策略是实现父接口的Data
;
如果我Data
在任何地方都输入提示,我会失去一致性,因为我应该确保在任何对应的地方都有可用 getSomeParticularRandomData
的getOtherParticularRandomData
方法。
这更像是一个设计问题。
欢迎任何形式的建议,我希望我没有把这些例子弄得一团糟。
谢谢
解决方案
推荐阅读
- jquery - Bootstrap 3 form-control-feedback 元素上的单击事件不起作用
- apache-kafka - 使用常规 `kafka-clients` 从 Kafka Streams 中至少模拟一次
- compilation - 在 macOS 中静态编译 Nim 程序
- python - 根据 groupby 输出更新列值
- python - TensorFlow:将 GRUCell 权重从 compat.v1 转换为 tensorflow 2
- video - 使用 ffmpeg 获取多个视频输入的多个缩略图
- c# - 无法从 Azure 上的 Visual Studio Test 运行测试程序集
- docker - Docker golang busybox“没有这样的文件或目录”错误
- laravel - 错误 500:Mailgun 的服务器当前无法访问
- flutter - 使用多个构造函数创建自定义小部件