Доброго времени суток.
Есть проект на PHP c Yii2 и ~DDD. Все данные предоставляются пользователям на двух языках: Русском и Английском.
В рамках проекта есть сущность
Disease (для примера), привязанная к конкретному пользователю.
class Disease
{
/**
* @var string
*/
public $id;
/**
* @var int
*/
public $userId;
/**
* @var string
*/
public $icd10Code;
/**
* @var string
*/
public $userBasedValue;
}
(ICD-10 - классификатор заболеваний Всемирной Организации Здравоохранения)
Данная сущность не содержит название заболевания, т.к. оно будет разным на разных языках. Сейчас название (как и все остальные локализованные данные,
ряд данных завязан также на пользователя, который выполняет запрос) подтягивается на этапе формирования ответа (в трасформере
Fractal'а, презентационный слой). Но теперь появилась необходимость добавить новый источник данных, который требует передавать язык и данные пользователя, необходимые для формирования ответа, в качества параметра запроса и, соответственно, возвращает полностью локализованные данные по заболеванию с учетом переданных данных пользователей.
Данные из этих двух источников объединяются и выводятся в одном списке.
Как корректно решить данную задачу?
Использовать instanceof в трансформере особо нет желания...Пока в голову приходит лишь такой вариант:
Сделать сущность
LocalizedDisease (потомок
Disease с доп. полями
$title и
$userBasedValueDescription) для нового репозитория, далее обернуть получение полного списка заболеваний в некий
DiseaseService::getList(), который будет дергать оба репозитория и оборачивать каждый полученный объект (
Disease или
LocalizedDisease) в объект соответствующего класса имплементирующего интерфейс вида:
interface DiseasePresenterInterface
{
public getICD10Code(): string;
public getTitle(): string;
public getUserBasedValueDescription(): string;
}
Который уже и определяет откуда брать данные по заболеванию для конкретного пользователя. В итоге получится, что
DiseasePresenter (для старого класса
Disease) будет дергать спец. репозиторий с заболеваниями (который сейчас дергает трансформер Фрактала) по
Disease::$id, а
LocalizedDiseasePresenter (для
LocalizedDisease) будет просто использовать значение переменных
LocalizedDisease::$title и
LocalizedDisease::$userBasedDescription.
Но что-то мне подсказывает, что это не самый правильный способ решить данную задачу...