avantgarde / shopware-cli
Shopware 4.x 的 cli 命令基础设施框架
Requires
- symfony/config: 2.3.*
- symfony/console: 2.3.*
- symfony/dependency-injection: 2.3.*
- symfony/filesystem: 2.3.*
- symfony/yaml: 2.3.*
Requires (Dev)
- phpunit/phpunit: 3.7.*
This package is not auto-updated.
Last update: 2024-09-23 13:27:10 UTC
README
SHOPWARE 4.2 自带 CLI 框架,因此我建议使用它而不是这个库!
ShopwareCLI 不仅是一个不断增长的 Shopware CLI 工具库,而且是一个完整的架构框架,可以添加功能丰富的命令行应用程序到您的 Shopware 系统。
它基于强大的 Symfony Console 组件,支持管理多个 Shopware 实例,并附带一个不断增长的行政任务管理器和代码生成器集。
免责声明:ShopwareCLI 是我日常与 Shopware 工作的结果。我发布它并不是因为它已经稳定,而且它与 Shopware AG 没有关系。我发布它,因为我对闭源不感到舒适。
ShopwareCLI 支持 Shopware 4.1 和 4.0,并提供零配置回退。
它受 BSD-3 许可。
安装
ShopwareCLI 至少需要 PHP 5.4。
ShopwareCLI 通过 composer 安装。由于我们尚未达到稳定版本,您必须选择 dev-stable。
composer create-project avantgarde/shopware-cli shopwareCLI dev-master
这将把您的 ShopwareCLI 安装到名为 shopwareCLI 的文件夹中。在里面,您可以找到以下结构
Avantgarde
ShopwareCLI
... # Project Files
config
example.config.yml # A sample configuration file
phpunit.xml # Configuration for the test suite
services.yml # Dependency Injection Configuration
tmp # An internal directory for caching
vendor # Dependencies
composer.json # Dependency Definitions
README.md # This file
sw # The ShopwareCLI exectuable
将 example.config.yml
重命名为 config.yml
。有两个树结构需要配置:shops 和 commands。
ShopwareCLI 可以配置多个 Shopware 实例——这在开发环境中通常是这样的。如果您将远程商店挂载到本地驱动器,您甚至可以通过命令行控制远程商店。
命令是在系统内部可用的命令。ShopwareCLI 是为了轻松编写 Shopware 命令行应用程序而构建的,因此您可以添加自己的命令并准备使用整个基础设施。
建议为您的命令创建一个专门的 composer 包,并将其作为依赖项添加到 composer.json 中,因为您不需要配置自动加载器。
然而,将您的命令放在测试下并进行 ShopwareCLI 的拉取请求是一个非常好的想法,因为我很高兴将它们集成到其他开发者可能感兴趣的功能中。
就是这样。
./sw # Lists all available commands on *nix systems php sw # Same on windows, use that in all later examples
现在选择一个商店。如果您在 config.yml 中将您的商店命名为 foo,那么操作就很简单
./sw select foo
现在发生的情况是 ShopwareCLI 使用给定的商店路径从命令行建立 Shopware 的运行时环境——它引导 Shopware 实例(当然绕过 FrontController),配置依赖关系,建立数据库连接,并加载 doctrine 和 Zend 框架等资源。后续的命令将能够访问 Shopware 和 Enlight Core 功能。
如果您想使用另一个商店,只需再次运行选择命令即可。
如果没有选择商店,ShopwareCLI 将使用列表中的第一个。
现在您可以尝试使用可用的命令或编写自己的命令。
要获取帮助,请输入 ./sw help [commandname]
。
许多命令都有标志,例如:./sw cache:clear --templates
(仅清除模板缓存)或具有参数(如您已经使用的选择命令)。
您也可以使用快捷方式
./sw plugin:list # Lists all plugins in your system ./sw p:l # Does the same
还有许多其他功能可用,例如自动完成和用于配置的交互式 shell,我计划将这些功能用于即将推出的功能,例如扩展启动器或交互式模型生成。
由于我们基于symfony控制台,因此阅读它的文档可能是一个很好的开始。在编写自己的命令时,它可能也会很有用!
编写自己的命令
编写自己的命令非常简单。一旦您阅读了symfony控制台文档,您就几乎完全准备好编写shopware的命令行工具了。
在命令的执行文件中,您可以访问Shopware的全局函数,例如Shopware()和Enlight(),同时还有一个已建立的数据库连接,插件可以操作,Doctrine存在,等等。还有自动加载。您可以在自己的命令中使用核心代码的大部分内容。
然而,有些事情是ShopwareCLI特有的,比如您必须将您的命令注册到config.yml中。
您可能还需要有关商店的信息,例如其Web URL或路径,并且您可能希望为您的命令编写单元测试。
这样做的基本方法是在您的命令中实现EnvironmentAwareInterface
。它将注入您需要的一切,正如您在接口足迹中所见。
然而,通常在编写新命令时,您只想扩展ShopwareCommand
。它是symfony命令继承链的末尾,为您实现了功能并提供了一些快捷方式。
以下是一些示例
class YourCommand extends ShopwareCommand { protected function execute(InputInterface $input, OutputInterface $output) // Shopinformation $this->shop->getName(); # Name of the shop as configured in config.yml $this->shop->getPath(); # Root path of the configured shop $this->shop->getWeb(); # Web address of the Shop $this->shop->getShopwareInstance(); # Accessor to the Shopware() global function $this->shop->getEnlightInstance(); # Accessor to the Enlight() global function // There are as well some shortcuts $this->shop->getRepository($fullyQualifiedModelClassName); $this->shop->getDb(); // Services can be accessed like this: $this->getService($serviceName); // The configuration is available like this: $this->configuration->get('shops'); # Returns all configured shops as array; $this->configuration->getBaseDirectory(); # Returns the base directory of shopware CLI $this->configuration->getShopByName($name); # Returns a shop by the configured name // You can define your own configuration structure in config.yml and access it as // array like this: $this->configuration->get('your_configuration'); } }
虽然您可以从您的命令中访问Shopware()
和Enlight()
,但您应该使用ShopwareCLI的商店包装器,如通过$this->shop
提供的。它围绕Shopware的核心功能提供了一个包装器,由于它由应用程序注入到命令中,因此它是松散耦合的——这使得测试变得更容易。
ShopwareCLI使用一些其他的symfony组件,如filesystem或dependency-injection。如果您不熟悉这些工具,您可能想查看出色的组件文档,因为它们真正帮助您为shopware编写可测试和可维护的命令行应用程序。
执行控制器操作
ShopwareCLI通过编写命令并为您提供对整个Shopware基础设施的访问来支持您。
然而,大多数已实现的用例,无论是Shopware的插件还是您的插件,都是通过控制器操作的。Shopware的MVC模式(如在大多数如果不是所有PHP MVC框架中)与HTTP请求/响应周期相关联,这在命令行中不可用。
这将迫使您在您的命令中重新实现控制器逻辑。这不是DRY,这不是KISS,这不是FUN!
但是,ShopwareCLI应该是有趣的!因此,它提供了一个易于使用的控制器组件,这使得执行Shopware的控制器操作变得非常容易。
为了使控制器CLI就绪,您必须在CLI上下文中扩展原始控制器,如下所示
class PluginController extends \Shopware_Controllers_Backend_Plugin { use CLIControllerTrait; public function __construct(array $pluginInformation) { $this->initialize($pluginInformation); } }
如您所见,我们只需编写很少的代码。
CLI就绪的控制器必须满足两个要求
- 它必须使用
Avantgarde\ShopwareCLI\Controller\CLIControllerTrait
- 它必须重写构造函数
在幕后,特性正在修补原始的Enlight_Action,并用它自己的实现替换了其核心演员——即Request和View。
不需要在构造函数中接受一个数组,但立即初始化CLI控制器是一种良好的实践。
$pluginInformation
成为请求数据,并将其包装在类中传递给控制器,伪装成请求。
让我们看看一个实际的实现,plugin:deactivate
是一个使用PluginController的命令
$pluginName = $input->getArgument('plugin'); $repository = $this->shop->getRepository('\Shopware\Models\Plugin\Plugin'); /** @var \Shopware\Models\Plugin\Plugin $plugin */ $plugin = $repository->findOneBy(['name' => $pluginName]); $controller= new PluginController( [ 'id' => $plugin->getId(), 'installed' => $plugin->getInstalled(), 'version' => $plugin->getVersion() ] ); $controller->savePluginAction();
要调用的操作名为savePluginAction
,它需要一些有关插件作为数组提供的信息。我们将它们传递给构造函数并可以调用控制器操作。就这么简单。
最后一步是打印一些输出。控制器正在将输出信息分配给视图类,在正常情况下,smart模板或ExtJS将负责渲染。我们可以通过检索这些分配来轻松地报告操作的结果
if ($controller->getAssign()['success']) { // Looks like it worked! } else { // Something went wrong. };
控制器组件是从一个实际项目演变而来的,可能还没有隐藏你项目中所有必要的功能。但是,它考虑了扩展性,所以请报告缺失的功能,以帮助稳定它。