Здравствуйте.
Посмотрел вот такой
материал по тому, как организовать работу нескольких API одновременно. Наиболее мне подходящий метод - это трансформация Request запросов, для формирования необходимой для сервиса структуры данных. Сервисы бизнес логики всегда одни и меняются только в сторону актуальной версии api. Вопрос остается только в том, как в PHP , а в частности, в Symfony организовать такую структуру ?
Т.е. как я себе это представляю:
- будет использоваться трансформер в контроллере, при получении даты из requesta трансформер валидирует эти данные для той версии апи, которую обрабатывает данный контроллер, далее, если данные верны, трансформер преобразовывает эти данные в те, которые будут необходимы для работы нашего сервиса.
- и будет использоваться валидатор в сервисе, который валидирует данные, уже непосредственно в сервисе.
На примере :
В первой версии API при создании профиля мы использовали поля first_name, last_name, patronymic .
Во второй версии API мы используем только поле name_info в котором содержится информация ФИО . Соответственно сервис будет работать у нас с новой версией и на вход будет принимать массив с ключом $data['name_info'], который и будет валидировать.
class ProfileFactory
{
public function create(array $data){
// throwing some ValidateException
$this->validator->validate(CreationValidateRules(), $data);
$profile = new Profile();
$profile->setNameInfo($data['name_info']); // Вот тут смущает то, что сервис и валидатор знают о ключах массива отдельно друг от друга
//.... some code
return $profile;
}
}
В контроллере новой версии мы будем в сервис передавать просто массив,
class ProfileControllerApi_2{
public function createProfile(Request $request){
$data = $request->request->all();
$profile = $this->get('profile_factory')->create($data );
// ... etc.
}
}
а в старой, будем пропускать массив через валидатор и трансформер, чтобы массив удовлетворял новым требованиям.
class ProfileControllerApi_1{
public function createProfile(Request $request){
$data = $request->request->all();
//throwing some ValidateException
$transformedData = $this->transformerHandler->transform(ProfileCreatingTransformer(), $data);
$profile = $this->get('profile_factory')->create($transformedData );
// ... etc.
}
}
Но есть такие моменты, как ошибки при валидации. Например отправляю я данные на старый API, но трансформер неверно сформировал массив для сервиса и вместо name_info, добавил nameS_info . Должен ли тут сервис кидать валидационное исключение (сервис тоже валидирует), ведь клиент, который прислал данные на сервер, присылал валидные данные для старой версии, а эта ошибка трансформера. Или исключения разделить по типам - для исключений валидации внутри сервиса - кидать ServiceValidationException, а для исключений внутри валидаторов контроллера просто ValidationException ?
Прошу прощения за сумбурность, надеюсь более-менее понятно объяснил, просто в голове каша, хочется как-то более правильно сделать.
Можно ли использовать такую структуру, либо есть другие, наиболее оптимальные подходы ?