shopsys / plugin-interface
Shopsys平台插件通用接口
Requires
- php: ^8.3
- symfony/monolog-bridge: ^5.4.0
Requires (Dev)
- shopsys/coding-standards: 14.0.1
- 16.0.x-dev
- 15.0.x-dev
- 14.0.x-dev
- v14.0.1
- v14.0.0
- 13.0.x-dev
- v13.0.0
- 12.1.x-dev
- 12.0.x-dev
- v12.0.0
- v11.1.0
- dev-master / 11.0.x-dev
- v11.0.0
- 10.0.x-dev
- v10.0.5
- v10.0.4
- v10.0.3
- v10.0.2
- v10.0.1
- v10.0.0
- 9.1.x-dev
- v9.1.3
- v9.1.2
- v9.1.1
- v9.1.0
- 9.0.x-dev
- v9.0.4
- v9.0.3
- v9.0.2
- v9.0.1
- v9.0.0
- 8.1.x-dev
- v8.1.2
- v8.1.1
- v8.1.0
- 8.0.x-dev
- v8.0.0
- 7.3.x-dev
- v7.3.7
- v7.3.6
- v7.3.5
- v7.3.4
- v7.3.3
- v7.3.2
- v7.3.1
- v7.3.0
- 7.2.x-dev
- v7.2.2
- v7.2.1
- v7.2.0
- 7.1.x-dev
- v7.1.1
- v7.1.0
- 7.0.x-dev
- v7.0.1
- v7.0.0
- v7.0.0-beta6
- v7.0.0-beta5
- v7.0.0-beta4
- v7.0.0-beta3
- v7.0.0-beta2
- v7.0.0-beta1
- v7.0.0-alpha6
- v7.0.0-alpha5
- v7.0.0-alpha4
- v7.0.0-alpha3
- v7.0.0-alpha2
- v7.0.0-alpha1
- v0.3.0
- v0.2.0
- v0.1.0
- dev-alpha
- dev-rc-15-0-0
- dev-pt-yaml-standards-vol-2
- dev-rc-12-0-0
- dev-tl-fix-failing-12-0-builds
- dev-mg-js-translations-fix
- dev-mg-split-repo
- dev-rc-11-1-0
- dev-mg-deployment
- dev-mg-project-cold-fusion
- dev-mg-remove-manifests
- dev-tl-fix-project-base
- dev-rc-11-0-0
- dev-rc-10-0-5
- dev-rk-fw-uprage-from-10-to-11-part-3
- dev-rc-v9-1-3
- dev-rk-fw-1019-api-query-name-in-symfony-profiler
- dev-rk-fw-uprage-from-10-to-11-part-2
- dev-rc-10-0-4
- dev-rc-10-0-3
- dev-rc-10-0-2
- dev-mg-release-lock
- dev-mg-remove-twig-extension
- dev-rk-fw-uprage-from-10-to-11-part-1
- dev-rc-10-0-1
- dev-mg-fw-933-remove-rootdir
- dev-rc-10-0-0
- dev-mg-upgrade-php8
- dev-mg-remove-be-api-integration
- dev-rv-fw-837-doctrine-upgrade
- dev-rv-fw-847-migrations-tests
- dev-mg-improve-entity-extension
- dev-rv-fw-810-fix-actions
- dev-rc-v9-1-2
- dev-rc-v7-3-7
- dev-mg-allow-dependency
- dev-mg-fix-phpstan-packages
- dev-mg-force-proxy-manager-version
- dev-mg-update-node
- dev-origin/tl-phpstan-all-packages
- dev-tl-release-9-1-1
- dev-ds-coding-standards-allow-symfony-5-higher
- dev-tl-remove-package-builder
- dev-tl-github-actions-for-packages
- dev-ds-fix-ecs
- dev-mg-update-helios-elfinder
- dev-tp-allow-coding-standards-for-symfony5
- dev-rc-v9-1-0
- dev-rc-v7-3-6
- dev-rc-v9-0-4
- dev-tl-fix-docker-limits
- dev-mg-php74-only
- dev-rc-v9-0-3
- dev-ds-more-coding-standards
- dev-rc-v7-3-5
- dev-ds-ecs-path-fix
- dev-rc-v9-0-2
- dev-ds-eof-new-line
- dev-ds-phpstan-lvl-5
- dev-tl-fix-phpstan
- dev-rc-v9-0-1
- dev-tl-add-psr-14
- dev-ds-fixed-framework-standaards
- dev-rc-v7-3-4
- dev-rc-v8-1-2
- dev-rc-v9-0-0
- dev-tl-fix-current-customer-user
- dev-tp-js-fixes
- dev-vitek-rostislav-patch-3
- dev-tg-grunt-webpack
- dev-tp-symfony4
- dev-rv-eur-on-first-domain
- dev-rc-v7-3-3
- dev-tp-update-composer
- dev-ds-easier-elastic-extensebility
- dev-rc-v8-1-1
- dev-rc-v8-1-0
- dev-tp-npm-link
- dev-mg-weird-flex-but-ok
- dev-ds-fix-project-base-dependency
- dev-ds-fix-sed-macos
- dev-mg-graphql-categories
- dev-ds-kubernetes-simplify
- dev-tl-rv-datafixtures-refactoring
- dev-ds-kubernetes-simplify-test
- dev-rv-extended-classes-fixer
- dev-rv-phpstan-lvl4
- dev-ds-test-install-script-automatically
- dev-rc-8-0-0
- dev-ss-api-import-products
- dev-do-version-lock
- dev-rc-v7-3-0
- dev-ss-api-separated-from-default-project-base
- dev-do-elastic-structure-deploy
- dev-mg-fix-k8s-https
- dev-ph-price-calculation
- dev-ph-redis-clients
- dev-tl-fix-tests-bc-break
- dev-tl-removed-tests-bc-break
- dev-tl-united-non-bc-break-service-injections
- dev-ss-tl-api-products
- dev-ph-phing-test
- dev-tl-end-support-php-71
- dev-bb-multidomain-sitemap
- dev-do-mg-mail-attachments
- dev-bb-initcontainer-owner-fix
- dev-bb-flysystem-volume-driver
- dev-do-phpstan-upgrade
- dev-rv-read-model-bck
- dev-jg-redis-cache
- dev-mg-elastic-filtering
- dev-rv-upgrade-ecs
- dev-bb-ecs-hotfix
- dev-jg-form-ordering
- dev-rv-better-php-doc-parser-config
- dev-do-fixtures-project-base
- dev-mg-multiple-cron
- dev-mc-cdn-bucket
- dev-sspooky13-pt-yaml-standards
- dev-do-product-export-fix
- dev-mc-ph-google-cloud-bundle
This package is auto-updated.
Last update: 2024-09-25 11:41:45 UTC
README
提供Shopsys平台与插件之间兼容性的接口包。
此仓库由shopsys/shopsys monorepo维护,变更信息在monorepo CHANGELOG.md中。
功能
此包包含负责通用功能的接口,这些功能几乎可在任何插件中使用。对于特定功能,如生成产品数据包,有单独的仓库。
示例
例如,在下面的CRUD扩展部分中查看AcmeProductCrudExtension
的使用示例。
存储数据
存储插件数据最佳方式是使用Doctrine实体。在您的插件中创建一个文件夹(例如src/Entity
),并将实体放在那里。然后您需要创建DoctrineOrmMappingPass
并将其添加为CompilerPass
到您的YourBundleNameBundle
类中。这可以通过以下方式完成:
// vendor/your-bundle-name-bundle/src/YourBundleNameBundle.php // ... /** * @inheritdoc */ public function build(ContainerBuilder $container) { parent::build($container); $container->addCompilerPass( DoctrineOrmMappingsPass::createAnnotationMappingDriver( [$this->getNamespace() . '\Entity'], [$this->getPath() . '/Entity'] ) ); } // ...
这告诉Doctrine在哪里查找您的实体。现在您可以创建Repository
并像往常一样管理您的数据。
CRUD扩展
有时您的插件需要一些额外信息来包含在实体中,例如,您需要跟踪产品的重量。这可以通过扩展实体CRUD模型与您的自定义子表单来解决。
为此,您应该实现PluginCrudExtensionInterface
并在DI容器中使用带有shopsys.crud_extension
标记的服务。标记应具有定义要扩展的CRUD模型的type
属性(例如,"product"
)。
每个表单扩展都有自己的标签、表单类型和管理表单数据的方法。
示例
services: acme.acme_product_crud_extension: class: AcmePlugin\AcmeProductCrudExtension tags: - { name: shopsys.crud_extension, type: product } acme.acme_data_form_type: class: AcmePlugin\AcmeProductFormType tags: - { name: form.type }
// ... class AcmeProductCrudExtension implements PluginCrudExtensionInterface { private $acmeProductFacade; public function __construct(AcmeProductFacade $acmeProductFacade) { $this->acmeProductFacade = $acmeProductFacade; } public function getFormTypeClass() { return AcmeProductFormType::class; } public function getFormLabel() { return 'ACME data'; } public function getData($productId) { $acmeProduct = $this->acmeProductFacade->findByProductId($productId); $pluginData = [ 'attribute' => $acmeProduct->getAttribute(), ]; return $pluginData; } public function saveData($productId, $data) { $acmeProductData = new AcmeProductData(); $acmeProductData->attribute = $data['attribute']; $this->acmeProductFacade->save($productId, $acmeProductData); } public function removeData($productId) { $this->acmeProductFacade->remove($productId); } }
演示数据
为了便于测试或演示您插件的用法,您可能希望提供演示数据。在这种情况下,您应该实现PluginDataFixtureInterface
,它将负责将演示数据加载到核心中。
您需要做的只是实现PluginDataFixtureInterface::load()
方法,并在DI容器中使用带有shopsys.data_fixture
标记的服务。
示例
services: acme.acme_bundle.data_fixture: class: AcmePlugin\AcmeDataFixture tags: - { name: shopsys.data_fixture }
class AcmeDataFixture implements PluginDataFixtureInterface { private $acmeProductFacade; public function __construct(AcmeProductFacade $acmeProductFacade) { $this->acmeProductFacade = $acmeProductFacade; } public function load() { $firstAcmeProductData = new AcmeProductData(); $firstAcmeProductData->enableWeightCalculation = true; $firstAcmeProductData->weight = 42; $firstAcmeProductData->domainId = 1; $this->acmeProductFacade->save($firstAcmeProductData); $secondAcmeProductData = new AcmeProductData(); $secondAcmeProductData->enableWeightCalculation = false; $secondAcmeProductData->weight = null; $secondAcmeProductData->domainId = 2; $this->acmeProductFacade->save($secondAcmeProductData); } }
CRON模块
当您的插件需要定期执行某些任务时,例如每六小时下载货币汇率,您可以使用CRON模块。
有2种类型的CRON模块接口
SimpleCronModuleInterface
- 用于执行时间较短的短任务
IteratedCronModuleInterface
- 用于可以分成更小部分的长运行任务
- 如果模块运行时间过长,它将被挂起,并在下一个机会被唤醒并重新运行
您可以实现其中之一并使用带有shopsys.cron
标记的服务在DI容器中进行标记。
每当当前系统时间与标记属性中的指定掩码匹配时,CRON模块将自动启动hours
和minutes
。
示例
acme.data_download_cron_module: class: AcmePlugin\AcmeDataDownloadCronModule tags: - { name: shopsys.cron, hours: '*/6', minutes: '0' }
// ... class AcmeDataDownloadCronModule implements SimpleCronModuleInterface { /** * @var \Symfony\Bridge\Monolog\Logger */ private $logger; public function setLogger(Logger $logger) { $this->logger = $logger; } public function run() { $data = $this->downloadData(); $this->saveData($data); $this->logger->info(sprintf('Downloaded %d new records.', count($data))); } // ... }
如何实现插件
插件以Symfony Bundle的形式实现。有关如何编写新Bundle的提示,请参阅可重用Bundle的最佳实践。
贡献
感谢您对Shopsys插件接口包的贡献。我们一起使Shopsys平台变得更好。
此存储库为只读。如果您想报告问题和/或发送拉取请求,请使用主Shopsys存储库。
在贡献之前,请检查我们的贡献指南。
支持
当您遇到麻烦或需要帮助时,最好的方法是加入我们的Slack。
如果您想报告问题,请使用主Shopsys存储库。