Laravel 5.4 PHP приложение здесь.
Мне нужны стратегии, чтобы использовать разные алгоритмы для зачисления учащихся в школу в зависимости от того, откуда поступают данные.
Для двух поставщиков данных есть две конечные точки.
Это нормальные маршруты, которые затрагивают методы контроллера.
<?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() {}
}
Эта форма запросов реализует интерфейсы с различными получателями в зависимости от поставщика данных.
<?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);
}
Моя проблема в том, что здесь я должен получить ошибку. Поскольку даже если интерфейсы Data1
и Data2
расширяют интерфейс Data
, дочерние стратегии реализуют Data1
и Data2
, а его родительская стратегия реализует родительский интерфейс Data
;
Если я подсказка типа Data
везде, где я теряю согласованность, потому что я должен быть уверен, что доступны методы getSomeParticularRandomData
и getOtherParticularRandomData
, где бы они ни соответствовали.
Это больше похоже на вопрос дизайна.
Любой совет, добро пожаловать, я надеюсь, я не слишком возился с примерами.
Спасибо