扩展是可再分发的软件包,专门设计用于 Yii 应用程序,并提供现成的功能。例如,yiisoft/yii2-debug 扩展在应用程序每个页面的底部添加了一个方便的调试工具栏,以帮助您更轻松地了解页面的生成方式。您可以使用扩展来加速您的开发过程。您还可以将您的代码打包成扩展,与其他人分享您的优秀作品。
信息:我们使用术语“扩展”来指代 Yii 特定的软件包。对于可以在没有 Yii 的情况下使用的通用软件包,我们将使用术语“包”或“库”来指代它们。
要使用扩展,您需要先安装它。大多数扩展都作为 Composer 包分发,可以通过以下两个简单的步骤安装
composer.json
文件,并指定要安装哪些扩展(Composer 包)。composer install
以安装指定的扩展。请注意,如果您没有安装 Composer,则可能需要安装它。
默认情况下,Composer 安装注册在 Packagist 上的包 - 这是开源 Composer 包最大的存储库。您可以在 Packagist 上查找扩展。您也可以 创建您自己的存储库 并配置 Composer 使用它。如果您正在开发仅希望在您的项目中共享的私有扩展,这将非常有用。
Composer 安装的扩展存储在 BasePath/vendor
目录中,其中 BasePath
指的是应用程序的 基本路径。因为 Composer 是一个依赖项管理器,所以当它安装一个包时,它也会安装所有其依赖的包。
例如,要安装 yiisoft/yii2-imagine
扩展,请修改您的 composer.json
如下所示
{
// ...
"require": {
// ... other dependencies
"yiisoft/yii2-imagine": "*"
}
}
安装后,您应该在 BasePath/vendor
下看到 yiisoft/yii2-imagine
目录。您还应该看到另一个目录 imagine/imagine
,其中包含已安装的依赖包。
信息:
yiisoft/yii2-imagine
是由 Yii 开发团队开发和维护的核心扩展。所有核心扩展都托管在 Packagist 上,并命名为yiisoft/yii2-xyz
,其中xyz
对于不同的扩展有所不同。
现在您可以像使用应用程序自身的一部分一样使用已安装的扩展。以下示例展示了如何使用由yiisoft/yii2-imagine
扩展提供的yii\imagine\Image
类
use Yii;
use yii\imagine\Image;
// generate a thumbnail image
Image::thumbnail('@webroot/img/test-image.jpg', 120, 120)
->save(Yii::getAlias('@runtime/thumb-test-image.jpg'), ['quality' => 50]);
信息:扩展类由Yii 类自动加载器自动加载。
在某些罕见情况下,您可能希望手动安装某些或所有扩展,而不是依赖 Composer。为此,您应该
vendor
目录。如果扩展没有类自动加载器,但遵循PSR-4 标准,您可以使用 Yii 提供的类自动加载器来自动加载扩展类。您只需为扩展根目录声明一个根别名即可。例如,假设您已将扩展安装在vendor/mycompany/myext
目录中,并且扩展类位于myext
命名空间下,则您可以在应用程序配置中包含以下代码
[
'aliases' => [
'@myext' => '@vendor/mycompany/myext',
],
]
当您觉得需要与其他人共享您的优秀代码时,可以考虑创建一个扩展。扩展可以包含任何您喜欢的代码,例如辅助类、小部件、模块等。
建议您以Composer 包的形式创建扩展,以便其他用户可以更轻松地安装和使用它,如上一小节所述。
以下是创建扩展作为 Composer 包的基本步骤。
composer.json
的文件,如 Composer 所需。有关更多详细信息,请参阅下一小节。composer.json
¶每个 Composer 包都必须在其根目录中包含一个composer.json
文件。该文件包含有关包的元数据。您可以在Composer 手册中找到有关此文件的完整规范。以下示例显示了yiisoft/yii2-imagine
扩展的composer.json
文件
{
// package name
"name": "yiisoft/yii2-imagine",
// package type
"type": "yii2-extension",
"description": "The Imagine integration for the Yii framework",
"keywords": ["yii2", "imagine", "image", "helper"],
"license": "BSD-3-Clause",
"support": {
"issues": "https://github.com/yiisoft/yii2/issues?labels=ext%3Aimagine",
"forum": "https://forum.yiiframework.com/",
"wiki": "https://yiiframework.cn/wiki/",
"irc": "ircs://irc.libera.chat:6697/yii",
"source": "https://github.com/yiisoft/yii2"
},
"authors": [
{
"name": "Antonio Ramirez",
"email": "[email protected]"
}
],
// package dependencies
"require": {
"yiisoft/yii2": "~2.0.0",
"imagine/imagine": "v0.5.0"
},
// class autoloading specs
"autoload": {
"psr-4": {
"yii\\imagine\\": ""
}
}
}
每个 Composer 包都应该有一个包名称,该名称在所有其他包中唯一标识该包。包名称的格式为vendorName/projectName
。例如,在包名称yiisoft/yii2-imagine
中,供应商名称和项目名称分别为yiisoft
和yii2-imagine
。
不要使用yiisoft
作为您的供应商名称,因为它保留供 Yii 核心代码使用。
我们建议您为表示 Yii 2 扩展的包的项目名称添加前缀yii2-
,例如myname/yii2-mywidget
。这将使用户更容易分辨某个包是否是 Yii 2 扩展。
重要的是,您应将扩展的包类型指定为yii2-extension
,以便在安装时可以将该包识别为 Yii 扩展。
当用户运行composer install
来安装扩展时,文件vendor/yiisoft/extensions.php
将自动更新以包含有关新扩展的信息。通过此文件,Yii 应用程序可以知道安装了哪些扩展(可以通过yii\base\Application::$extensions访问这些信息)。
您的扩展依赖于 Yii(当然)。因此,您应该在composer.json
的require
条目中列出它(yiisoft/yii2
)。如果您的扩展还依赖于其他扩展或第三方库,则也应列出它们。确保您还为每个依赖项包列出适当的版本约束(例如1.*
、@stable
)。当您的扩展以稳定版本发布时,请使用稳定依赖项。
大多数 JavaScript/CSS 包都是使用Bower和/或NPM管理的,而不是 Composer。Yii 使用Composer 资产插件来启用通过 Composer 管理此类包的功能。如果您的扩展依赖于 Bower 包,则只需在composer.json
中列出依赖项,如下所示
{
// package dependencies
"require": {
"bower-asset/jquery": ">=1.11.*"
}
}
以上代码表示扩展依赖于jquery
Bower 包。通常,您可以使用bower-asset/PackageName
在composer.json
中引用 Bower 包,并使用npm-asset/PackageName
引用 NPM 包。当 Composer 安装 Bower 或 NPM 包时,默认情况下,包内容将分别安装在@vendor/bower/PackageName
和@vendor/npm/Packages
目录下。这两个目录也可以使用较短的别名@bower/PackageName
和@npm/PackageName
来引用。
有关资产管理的更多详细信息,请参阅资产部分。
为了使您的类能够由 Yii 类自动加载器或 Composer 类自动加载器自动加载,您应该在composer.json
文件中指定autoload
条目,如下所示
{
// ....
"autoload": {
"psr-4": {
"yii\\imagine\\": ""
}
}
}
您可以列出单个或多个根命名空间及其对应的文件路径。
当扩展安装在应用程序中时,Yii 将为每个列出的根命名空间创建一个别名,该别名引用与命名空间对应的目录。例如,上述autoload
声明将对应于一个名为@yii/imagine
的别名。
由于扩展旨在供其他人使用,因此您在开发过程中通常需要付出额外的努力。下面我们介绍一些创建高质量扩展的常见和推荐做法。
为了避免名称冲突并使扩展中的类可自动加载,您应该使用命名空间,并按照PSR-4 标准或PSR-0 标准为扩展中的类命名。
您的类命名空间应以vendorName\extensionName
开头,其中extensionName
类似于包名称中的项目名称,但它不应包含yii2-
前缀。例如,对于yiisoft/yii2-imagine
扩展,我们使用yii\imagine
作为其类的命名空间。
不要使用yii
、yii2
或yiisoft
作为您的供应商名称。这些名称保留供 Yii 核心代码使用。
有时,您可能希望扩展在应用程序的引导过程阶段执行一些代码。例如,您的扩展可能希望响应应用程序的beginRequest
事件以调整某些环境设置。虽然您可以指示扩展的用户在扩展中显式地将您的事件处理程序附加到beginRequest
事件,但更好的方法是自动执行此操作。
为了实现此目标,您可以通过实现yii\base\BootstrapInterface来创建一个所谓的引导类。例如,
namespace myname\mywidget;
use yii\base\BootstrapInterface;
use yii\base\Application;
class MyBootstrapClass implements BootstrapInterface
{
public function bootstrap($app)
{
$app->on(Application::EVENT_BEFORE_REQUEST, function () {
// do something here
});
}
}
然后,您在扩展的composer.json
文件中列出此类,如下所示,
{
// ...
"extra": {
"bootstrap": "myname\\mywidget\\MyBootstrapClass"
}
}
当扩展安装在应用程序中时,Yii 将在每个请求的引导过程中自动实例化引导类并调用其bootstrap()方法。
您的扩展可能需要访问数据库。不要假设使用扩展的应用程序将始终使用Yii::$db
作为 DB 连接。相反,您应该为需要 DB 访问的类声明一个db
属性。该属性将允许扩展的用户自定义他们希望扩展使用的 DB 连接。例如,您可以参考yii\caching\DbCache类,并查看它是如何声明和使用db
属性的。
如果您的扩展需要创建特定的 DB 表或对 DB 架构进行更改,则您应该
如果您的扩展是小部件或模块,则很可能需要一些资产才能工作。例如,模块可能会显示一些包含图像、JavaScript 和 CSS 的页面。由于扩展的文件都位于同一个目录下,并且在安装到应用程序中时无法通过 Web 访问,因此您有两种选择可以使资产文件可以直接通过 Web 访问
我们建议您使用第二种方法,以便您的扩展可以更轻松地被其他人使用。有关如何一般性地使用资产的更多详细信息,请参阅资产部分。
您的扩展可能被支持不同语言的应用程序使用!因此,如果您的扩展向最终用户显示内容,则应尝试对其进行国际化和本地化。特别是,
Yii::t()
中,以便可以对其进行翻译。面向开发人员的消息(例如内部异常消息)不需要翻译。有关更多详细信息,请参阅国际化部分。
您希望您的扩展能够完美运行,而不会给其他人带来问题。为了达到这个目标,您应该在将扩展发布到公共平台之前对其进行测试。
建议您创建各种测试用例来覆盖扩展代码,而不是依赖手动测试。每次在发布扩展的新版本之前,您都可以简单地运行这些测试用例,以确保一切正常。Yii 提供了测试支持,可以帮助您更轻松地编写单元测试、验收测试和功能测试。有关更多详细信息,请参阅测试部分。
您应该为扩展的每个版本分配一个版本号(例如1.0.1
)。我们建议您在确定应使用哪些版本号时遵循语义版本控制实践。
要让其他人了解您的扩展,您需要将其发布到公众。
如果这是您第一次发布扩展,则应在 Composer 存储库(例如 Packagist)上注册它。之后,您只需在扩展的 VCS 存储库中创建一个发布标签(例如 v1.0.1
),并通知 Composer 存储库有关新版本的信息即可。然后,人们将能够找到新版本,并通过 Composer 存储库安装或更新扩展。
在扩展的版本中,除了代码文件外,您还应考虑包含以下内容,以帮助其他人了解和使用您的扩展
readme.md
。changelog.md
。upgrade.md
。信息:您的代码注释可以用 Markdown 格式编写。
yiisoft/yii2-apidoc
扩展提供了一个工具,您可以根据代码注释生成漂亮的 API 文档。
信息:虽然不是强制要求,但我们建议您的扩展遵守某些编码风格。您可以参考 核心框架代码风格。
Yii 提供以下核心扩展(或 "官方扩展"),这些扩展由 Yii 开发团队开发和维护。它们都已在 Packagist 上注册,并且可以根据 使用扩展 小节中的说明轻松安装。
以下官方扩展适用于 Yii 2.1 及更高版本。您无需为 Yii 2.0 安装它们,因为它们包含在核心框架中。
发现错别字或您认为此页面需要改进?
在 github 上编辑它 !
为了发表评论,请 注册 或 登录。