Для моего проекта мне нужно импортировать 12-15 файлов, от CSV, xml до gz. Поскольку все файлы имеют свою структуру, мне пришлось создать по одной команде для каждого файла. Но это уже слишком и хочется создать общий импорт для всех файлов.
Требования:
Что у меня в данный момент в команде:
$handle = fopen("https://example.csv",'r');
$output->writeln('Downloading done!');
$categortArray = [];
$categortA = [];
while (($row = fgetcsv($handle, 4096, ";")) !== FALSE)
{
$categortA [ $row[21]] = $row[23] ;
$categortArray [] = $row[21];
}
$output->writeln('Updating category list !');
$result = array_unique($categortArray);
$result2 = array_unique($categortA);
$distributor = $distributor->findByName("Name of Distributor");
foreach ($result as $productgroup) {
$result = $categoryRepository->findByTitle($productgroup);
if (empty($result)){
$category = new Category();
$category->setTitle($productgroup);
$category->setDescription("Category Description");
$category->setDistributor($distributor);
$categoryService->create($category);
}
}
foreach ($result2 as $key => $productgroup) {
$result = $categoryRepository->findByTitle($key);
/** @var $result Category */
if ($result !== null) {
$category = new Category();
$category->setTitle($productgroup);
$category->setParent($result[0]);
$category->setDescription("Name of Distributor");
$category->setDistributor($distributor);
$categoryService->create($category);
}
}
while (($row = fgetcsv($handle, 4096, ";")) !== FALSE)
{
foreach ($child as $c) {
if ($c->getTitle() === $row['21']) {
$product = new Product();
$product->setName($row[1]);
$product->setCategory($categoryTop);
$product->setSku($row[14]);
$product->setEanUpc($categoryTop->getId());
$this->productService->save($product);
}
}
}
Варианты, о которых я могу думать:
Также приветствуются советы по моей текущей команде Symfony.






Раньше я решал что-то похожее, теперь эти советы зависят от того, сколько данных вам нужно синхронизировать (у меня было около 8 источников каждый, около 10 000 элементов, синхронизация которых не длилась более 15 минут).
Архитектура решения такая
Преимущества этого решения:
Планирование зависит от ваших потребностей - я бы придерживался возможности запускать разные расписания в разное время и проверять, с каким интервалом обновляются источники, и синхронизировать с этим время обновления.
Пример TransformedDTO. Это не что иное, как заполнитель для ваших данных, который работает как ввод для процессоров и как выходные преобразователи.
class Product {
public $sku;
public $category;
public $name;
// Everything else which your processor know how to process
}
DTO - объект передачи данных, это будет всего лишь один общий объект, который будет использоваться как заполнитель для данных. Таким образом, у процессоров есть своего рода интерфейс / контракт, и они знают, что они получат за данные.
@ m-kebza у вас есть пример?
Добавлен небольшой пример, но остальное в основном зависит от вашей конкретной логики.
@ M-kebza, но этот публичный артикул и т. д. Уже включен в модель сущности продукта, так в чем же разница?
Идея заключается в том, что ваши процессоры не могут отображать данные о вашей сущности (а информация из источников в любом случае может быть неполной).
@ m-kebza, но у меня уже есть функция удаления обновления вставки в моем сервисе продуктов, которая выполняет функцию сопоставления данных. Я до сих пор не понимаю, что именно вы имеете в виду, не могли бы вы уточнить немного подробнее, чтобы я понял, что вы пытаетесь.
Идея состоит в том, чтобы разделить отображение данных из разных источников в ваше приложение. Означает, что позже вы можете добавить множество различных сопоставлений без изменения основных функций приложения.
@ M-kebza также включает в себя создание нескольких сопоставителей для каждого дистрибьютора, поскольку каждый дистрибьютор имеет свои собственные правила и набор данных, в некоторых есть xml, некоторые csv и т.д. и т.д. Так что в основном мне нужна логика вне класса сущности, и я поставил ее в службу или преобразователь данных.
Точно, для каждого дистрибьютора у вас будет средство отображения данных, которое будет создавать, какой вывод будет преобразован в DTO, который вы будете обрабатывать. Итак, в конце концов, ваша сущность не должна знать, как обрабатывать источник данных, потому что это будет логика этого преобразователя / процессора данных.
@ m-kebza, что вы имеете в виду под Transformer / TreansformerDTO, не могли бы вы это уточнить?