avantgarde/shopware-cli

Shopware 4.x 的 cli 命令基础设施框架

dev-master 2014-02-05 19:49 UTC

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。有两个树结构需要配置:shopscommands

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组件,如filesystemdependency-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,并用它自己的实现替换了其核心演员——即RequestView

不需要在构造函数中接受一个数组,但立即初始化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.
    };

控制器组件是从一个实际项目演变而来的,可能还没有隐藏你项目中所有必要的功能。但是,它考虑了扩展性,所以请报告缺失的功能,以帮助稳定它。