fastbolt / entity-importer
一个用于将CSV文件导入Doctrine实体的库
v1.0.0
2024-08-22 11:19 UTC
Requires
- php: >=8.2
- ext-zlib: *
- doctrine/persistence: ^2.4|^3.0
- guzzlehttp/guzzle: ^7.5
- phpoffice/phpspreadsheet: ^2.1
- portphp/csv: ^2.0
- symfony/config: ^6.0
- symfony/filesystem: ^6.0
- symfony/framework-bundle: ^6.0
- symfony/string: ^6.0
- webmozart/assert: ^1.11
Requires (Dev)
- fastbolt/test-helpers: ^0.1.1
- fig-r/psr2r-sniffer: ^1.3
- phpmd/phpmd: ^2.11
- phpstan/phpstan: ^1.4
- phpunit/phpunit: ^9.5
- psalm/plugin-phpunit: ^0.18.4
- psalm/plugin-symfony: ^v5.0
- slevomat/coding-standard: ^7.0
- spryker/code-sniffer: ^0.17.4
- squizlabs/php_codesniffer: ^3.6
- vimeo/psalm: ^5.6
- weirdan/doctrine-psalm-plugin: ^v2.8
README
实体导入库
此库旨在提供一种简单的方法将文件导入Doctrine实体。
先决条件
目前,该包已在PHP 7.4、8.0和8.1上进行了测试。
安装
该库可以通过composer安装
composer require fastbolt/entity-importer
配置
如果未自动配置,则需要将包在项目的bundles.php
文件中启用
<?php return [ Fastbolt\EntityImporter\EntityImporterBundle::class => ['all' => true], ];
实现
新导入器所需的最基本的代码是Fastbolt\EntityImporter\EntityImporterDefinition
的实现。我们建议扩展抽象类Fastbolt\EntityImporter\AbstractEntityImporterDefinition
。
目前,有两种导入源可用:Csv和Xlsx。
用法
实现上述接口后,控制台命令entity_importer:import
将自动识别新的实现。
在没有任何参数执行命令时,将显示所有可用的实现
实现示例
<?php namespace App\Component\Data\Import\EntityImporter; use App\Entity\Branch;use App\Entity\Material;use App\Entity\MaterialGroup;use App\Repository\BranchRepository;use App\Repository\MaterialGroupRepository;use App\Repository\MaterialRepository;use DateTime;use Doctrine\Persistence\ObjectRepository;use Fastbolt\EntityImporter\AbstractEntityImporterDefinition;use Fastbolt\EntityImporter\Reader\CsvReader;use Fastbolt\EntityImporter\Types\ImportSourceDefinition\Csv; /** * @template-implements Material */ class MaterialImporterDefinition extends AbstractEntityImporterDefinition { /** * @var Csv */ private Csv $importSourceDefinition; /** * @var MaterialRepository */ private MaterialRepository $repository; /** * @var MaterialGroupRepository */ private MaterialGroupRepository $materialGroupRepository; /** * @var BranchRepository */ private BranchRepository $branchRepository; /** * @param MaterialRepository $repository * @param MaterialGroupRepository $materialGroupRepository * @param BranchRepository $branchRepository */ public function __construct( MaterialRepository $repository, MaterialGroupRepository $materialGroupRepository, BranchRepository $branchRepository ) { $this->repository = $repository; $this->materialGroupRepository = $materialGroupRepository; $this->branchRepository = $branchRepository; $this->importSourceDefinition = new Csv('MDMATERIALS.csv', CsvReader::TYPE); } /** * @inheritDoc */ public function getName(): string { return 'materials'; } /** * @inheritDoc */ public function getDescription(): string { return 'Importer for Materials'; } /** * @inheritDoc */ public function getEntityClass(): string { return Material::class; } /** * @inheritDoc */ public function getIdentifierColumns(): array { return ['materialNumber', 'branch']; } /** * @inheritDoc */ public function getFields(): array { return [ 'materialGroup', 'branch', 'materialNumber', 'shortMaterialNumber', 'purchasingTextDe', 'purchasingTextEn', 'priceGroup', 'priceUnit', 'packingUnit', 'weight', 'purchasingAbcMark', 'language', 'availableSince', 'customsTariffNumber', 'ean', 'isOnlineMaterial', 'rangeIndicator', ]; } /** * @inheritDoc */ public function getImportSourceDefinition(): Csv { return $this->importSourceDefinition; } /** * @inheritDoc */ public function getRepository(): ObjectRepository { return $this->repository; } /** * @inheritDoc */ public function getFieldConverters(): array { return [ 'branch' => function ($value): Branch { return $this->branchRepository->find($value); }, 'materialGroup' => function ($value): MaterialGroup { return $this->materialGroupRepository->findOneBy(['name' => $value]); }, 'priceUnit' => static function ($value): int { return (int)trim($value); }, 'availableSince' => static function ($value): ?DateTime { if ('00000000' === $value) { return null; } return DateTime::createFromFormat('Ymd', $value); }, 'packingUnit' => static function ($value): int { return (int)trim($value); }, 'weight' => static function ($value): float { return (float)trim(str_replace(',', '', $value)); }, ]; } /** * @inheritDoc */ public function getSkippedFields(): array { return [ 'language', ]; } /** * @inheritDoc */ public function getEntityModifier(): ?callable { return static function (Material $material) { $material->setIsProtected(true); }; } }