0

我在 yii2 的基本项目中创建了模块,现在我想访问或使用该模块我的另一个项目/应用程序....

我怎样才能做到这一点。

请帮帮我。

4

1 回答 1

1

要在不同的应用程序中使用模块,您需要 3 件事。

  1. 该模块不得依赖于核心项目中的类。对于需要由核心项目实现的任何类,模块应定义接口并依赖于该接口而不是类本身。
  2. 模块应该使用不同的命名空间,app并且自动加载器必须知道如何从该命名空间加载类。(稍后会详细介绍)
  3. 您必须以与在第一个项目中添加模块相同的方式在配置中添加模块。

第 1 点和第 3 点几乎是不言自明的。如果不确定如何在配置中添加模块,请参阅 yii2 指南

现在回到第二点。虽然将模块复制到第二个项目的天真方法会起作用,但它会将维护模块变成噩梦,因为每个更改都必须在模块的每个副本中完成。所以最好把模块的代码放在一个地方,让每个项目都可以使用。有多种方法可以做到这一点。

如果您愿意,您可以将您的模块转换为扩展,并按照M. Eriksson在评论中的建议,通过 packagist 将其公开。之后,您只需通过 composer 添加您的扩展作为任何其他依赖项。

如果您不想在 packagist 上发布您的模块,Composer 还允许您定义和使用私有存储库。有关更多详细信息,请参阅作曲家文档

最简单的方法是将代码简单地放在项目之外的单独文件夹中。如果这样做,您必须确保项目中的自动加载器能够找到文件位置以加载类。有两种选择如何做到这一点。在任何情况下,您都希望避免与项目使用的名称空间发生冲突,这就是您需要使用不同名称空间的原因。

假设您已将模块文件放入文件夹/path/to/modules/myModule,并且模块中的所有类都属于 namespace modules\myModule。您必须确保您的网络服务器可以访问该文件夹并且可以在那里运行 php 脚本。

第一个选择是使用 Yii 的自动加载器。该自动加载器使用别名来查找类。如果您添加@modules别名并将其指向/path/to/modules文件夹,Yii 自动加载器将尝试从文件夹中的modules\*命名空间中查找任何类/path/to/modules。您可以在配置文件(web.php、console.php 或您使用的任何其他配置文件)中添加别名:

return [
    // ...
    'aliases' => [
        '@modules' => '/path/to/modules',
        // ... other aliases ...
    ],
];

第二个选项是使用项目的 composer.json 文件来设置由 composer 生成的自动加载器来加载你的类。

{
    "autoload": {
        "psr-4": {
            "modules\\": "/path/to/modules"
        }
    }

}

您可以在作曲家的文档中找到有关此的更多信息。不要忘记composer dump-autoload在 composer.json 文件中更改自动加载设置后运行以更新生成的自动加载器。

于 2022-02-17T10:15:36.577 回答