对于我的项目,我必须导入12-15个文件,从CSV,xml到gz不等。由于所有文件都有自己的结构,我必须为每个文件创建1个命令。但这太多了,想要为所有文件创建一般导入。
要求:
目前我的命令是什么:
$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命令的建议也表示赞赏。
答案 0 :(得分:0)
我过去在解决过类似的问题,现在这些建议取决于你需要同步多少数据(我有大约8个来源,每个大约10 000个项目同步,最近15分钟)。
解决方案的架构就像这样
此解决方案的优点:
对于日程安排,取决于您的需求 - 我会坚持在不同时间运行不同的日程安排,并检查更新源的间隔时间,并将更新时间与之同步。
示例TransformedDTO。它只不过是数据的占位符,可以作为处理器和输出变换器的输入。
class Product {
public $sku;
public $category;
public $name;
// Everything else which your processor know how to process
}