Борьба с PHP шаблонами стратегий и наследованием интерфейсов - PullRequest
1 голос
/ 09 апреля 2020

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, где бы они ни соответствовали.

Это больше похоже на вопрос дизайна.

Любой совет, добро пожаловать, я надеюсь, я не слишком возился с примерами.

Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...