如何在插件中要求作曲家包?

How to require a composer package inside a plugin?

我正在为 Shopware 6 项目编写一个插件,该项目需要一个 composer 包来验证条形码和 EAN。

我 运行 composer require imelgrat/barcode-validator 在我的插件文件夹中。它将要求添加到 composer.json 但它也直接在插件 vendor 文件夹中安装包(及其要求),这是错误的。

如何在 Shopware 6 vendor 文件夹中要求 composer 包并正确安装?

你不能。至少目前不会,如果您使用 zips 分发您的插件。如果您计划仅通过 composer 进行分发,则可以使用 'static-plugins' 文件夹通过 composer 在您的项目中安装您的插件,这也会安装 deps。

现在,如果您想通过 shopware 商店分发,则必须在插件 zip 中提供 vendor 文件夹。您还必须主动在插件中包含自动加载器 class.

以下代码片段位于插件 class 的 class 声明之上,并加载插件的 composer 自动加载器(如果存在)。这意味着您仍然可以通过 composer 进行分发,也可以通过 zip 文件进行分发。

if (file_exists(dirname(__DIR__) . '/vendor/autoload.php')) {
    $loader = require_once dirname(__DIR__) . '/vendor/autoload.php';
    if ($loader !== true) {
        spl_autoload_unregister([$loader, 'loadClass']);
        $loader->register(false);
    }
}

Example/source: https://github.com/runelaenen/shopware6-two-factor-auth/blob/master/src/RuneLaenenTwoFactorAuth.php

打包 zip 时,不要忘记包含 vendor 文件夹,这样您就可以分发插件了。

不过请记住,您不能在一个系统中使用一个包两次,class 名称必须是唯一的。因此,只包含您肯定不会被核心 Shopware 或其他包使用的包(以及它们的依赖项)。或者使用像 PHP Scoper 这样的工具来确定你的插件供应商文件夹的范围,这样一切都是唯一的,即使它已经在系统中使用了。


路线图

Shopware 在 roadmap 上集成了作曲家,因此这可能很快就会过时。在撰写本文时(2021 年 2 月),上述方法是可行的方法。

在您的插件中,您可以包含一个 vendor 文件夹,其中包含您的项目所需的包。

您不能将包包含在其他插件或其他 composer.json / vendor 由第 3 方创建的文件夹中。您只能管理插件包的安装。

Composer 是一种设计时考虑到您在受控环境中开发和分发代码的假设的工具。 当您在 WordPress 上发布插件或在 Joomla 上发布模块时,您是在无法控制所安装内容的系统上发布代码。为了克服这个限制,你必须准备你的插件 你知道不会与其他已安装的包发生冲突的包 或者你必须 为 composer 包添加前缀 具有不会有命名问题的名称空间(范围)。

这里有更多关于 PHP WordPress 前缀的信息: