justbetter / laravel-akeneo-products
轻松将产品从您的ERP导出到Akeneo
Requires
- php: ^8.1
- justbetter/laravel-akeneo-client: ^1.1
- justbetter/laravel-error-logger: ^2.3
- laravel/framework: ^10.0|^11.0
- spatie/laravel-activitylog: ^4.7
Requires (Dev)
- larastan/larastan: ^2.9
- laravel/pint: ^1.17
- orchestra/testbench: ^8.0|^9.0
- pestphp/pest: ^2.35
- phpstan/phpstan-mockery: ^1.1
- phpunit/phpunit: ^10.5
README
Laravel Akeneo Products
轻松将产品从您的ERP导出到Akeneo。
此包旨在轻松从您的ERP或其他(外部)源创建Akeneo中的产品,无需处理Akeneo中不同字段类型的复杂性。属性结构由包全部处理。这意味着简单的键值数组已足够用于启动upserting产品。
除了属性之外,您还可以设置家族、类别和其他您通常可以通过API访问的所有数据。
对于更复杂的使用案例,您还可以向有效载荷中添加自己的数据。
如果您的项目可以访问大量产品,则将产品分批检索和更新以分散负载。只有当产品发生更改时,才会将更新发送到Akeneo,以防止不必要的请求。
先决条件
此包使用Akeneo客户端。请确保按照其README正确安装和配置。
安装
安装composer包。
composer require justbetter/laravel-akeneo-products
设置
发布包的配置。
php artisan vendor:publish --provider="JustBetter\AkeneoProducts\ServiceProvider" --tag=config
将以下命令添加到您的调度器中。
<?php $schedule->command(\JustBetter\AkeneoProducts\Commands\Product\ProcessProductsCommand::class)->everyMinute(); $schedule->command(\JustBetter\AkeneoProducts\Commands\ProductModel\ProcessProductModelsCommand::class)->everyMinute();
工作原理
本节将描述产品的流程,但产品模型的使用方式相似。
当检索产品时,它会从(外部)源检索产品。如果检索到的数据不为空,它将被保存在数据库中。如果数据库模型的有效载荷已更改,则模型的update
-属性将被设置为true
。这样,包就知道了更新,并可以分批次进行。这些数字可以在您的检索器类中进行调整。
如果模型中已检索到产品,则可以设置模型的retrieve
-属性为true
,以自动再次检索数据。如果将其添加到您的调度器中,则由ProcessProductsCommand
完成。
在以下条件下,将处理数据库中保存的所有产品
- 如果将
retrieve
设置为true
,则将从(外部)源再次检索产品。 - 如果将
update
设置为true
,则将产品upsert到Akeneo。
此包不包含检索“所有”产品的方法。如果您希望每天检索所有产品,您必须自己调度带有标识符的RetrieveProductJob
。
<?php use JustBetter\AkeneoProducts\Jobs\Product\RetrieveProductJob; use JustBetter\AkeneoProducts\Jobs\ProductModel\RetrieveProductModelJob; RetrieveProductJob::dispatch('::identifier::'); RetrieveProductModelJob::dispatch('::code::');
检索产品
首先,创建您自己的检索器,因为这是包将与(外部)源交互的方式。
通过构建ProductData
类,包知道如何将此数据发送到Akeneo。
请确保您已在配置文件中设置了检索器。
本包还包含一个用于动态创建有效载荷的 属性
模型。我们还编写了一个 Nova 集成,使其更加简单,因为它提供映射资源。
示例
以下是一个如何使用本包的示例,使用配置的属性映射。
<?php use JustBetter\AkeneoProducts\Contracts\Akeneo\FormatsAttributeValues; use JustBetter\AkeneoProducts\Data\ProductData; use JustBetter\AkeneoProducts\Enums\MappingType; use JustBetter\AkeneoProducts\Models\Mapping; use JustBetter\AkeneoProducts\Retrievers\Product\BaseProductRetriever; class ExampleProductRetriever extends BaseProductRetriever { public function __construct( protected FormatsAttributeValues $formatValue ) { } public function retrieve(string $identifier): ?ProductData { // Get all configured attributes from the database. $attributes = Mapping::of(MappingType::Attribute)->get(); // This would be the product fetched from an ERP system. $product = [ 'SKU' => '1000', 'Title' => 'Ziggy', 'Category_Code' => 'STUFFED_TOYS', // ... ]; // Build up the "values" array for Akeneo. $values = [ // ]; foreach ($product as $key => $value) { /** @var ?Mapping $mapped */ $mapped = $attributes->firstWhere('source', '=', $key); if ($mapped === null || $value === null) { continue; } // Format the raw value into an appropriate attribute value for Akeneo. $data = $this->formatValue->format($mapped->destination, $value); // Add the value to the list, with the Akeneo field as the key. $values[$mapped->destination] = $data; } $data = [ 'identifier' => $identifier, 'values' => $values, ]; $family = Mapping::get(MappingType::Family, $product['Category_Code']); // Optionally, add a family. Note that you can also add categories. if ($family) { $data['family'] = $family->destination; } return ProductData::of($data); } }
产品模型可以类似实现,以下是一个示例
<?php use JustBetter\AkeneoProducts\Data\ProductModelData; use JustBetter\AkeneoProducts\Retrievers\ProductModel\BaseProductModelRetriever; class ExampleProductModelRetriever extends BaseProductModelRetriever { public function retrieve(string $code): ?ProductModelData { // return ProductModelData::of([ // ]); } }
支持的属性类型
目前,本包支持以下属性类型
pim_catalog_text
pim_catalog_textarea
pim_catalog_number
pim_catalog_metric
pim_catalog_boolean
pim_catalog_price_collection
pim_catalog_simpleselect
命令
本包包含一些命令。
产品
通过标识符检索产品,它将自动保存到数据库中。
php artisan akeneo-products:retrieve {identifier}
处理所有产品,这包括检索和更新产品。
php artisan akeneo-products:process
通过标识符更新产品。这将手动触发对 Akeneo 的更新,无论产品是否是最新的。
php artisan akeneo-products:update {identifier}
产品模型
通过代码检索产品模型,它将自动保存到数据库中。
php artisan akeneo-products:model:retrieve {code}
处理所有产品模型,这包括检索和更新产品模型。
php artisan akeneo-products:model:process
通过代码更新产品模型。这将手动触发对 Akeneo 的更新,无论产品模型是否是最新的。
php artisan akeneo-products:model:update {code}
质量
为确保本包的质量,运行以下命令
composer quality
这将执行三个任务
- 确保所有测试都通过
- 使用静态代码分析检查任何问题
- 检查代码是否格式正确
贡献
请参阅 CONTRIBUTING 了解详情。
安全漏洞
请查阅 我们的安全策略 了解如何报告安全漏洞。
鸣谢
许可证
MIT 许可证 (MIT)。请参阅 许可证文件 了解更多信息。