开发工具#
XF2 为开发者提供了一系列内置工具,可以帮助加快插件的开发速度。下面我们将介绍其中一些工具。
调试模式#
调试模式可以在 config.php
中启用,启用后您可以在管理面板中访问某些开发工具(例如创建路由、权限、管理导航等),并且还会在每个页面的底部显示一个输出,详细说明页面处理所需的时间、执行了多少查询来渲染页面以及使用了多少内存。悬停时,会显示一个工具提示,包含有关当前控制器、操作和模板名称的信息。您还可以点击时间输出,这将为您提供详细的查询运行情况以及导致该查询执行的堆栈跟踪。
您可以通过在 config.php
中添加以下内容来启用调试模式:
启用开发模式#
开发模式是一种特殊模式,在 config.php
文件中激活后,XF 会自动将开发文件写入您的 _output
目录。启用此模式后,才能启用文件系统模板编辑。由于开发模式会将文件写入文件系统,因此确保您具有适当的文件权限非常重要。这可能因环境而异,但典型的配置是确保您正在处理的任何插件的 _output
目录设置为 chmod 0777
。例如,如果您正在处理一个 ID 为 Demo
的插件,其开发输出将写入 src/addons/Demo/_output
,因此该目录需要完全可写。
启用开发模式后,调试模式 也会自动启用。
要启用开发模式,请在 config.php
文件中添加以下行:
$config['development']['enabled'] = true;
$config['development']['defaultAddOn'] = 'SomeCompany/MyAddOn';
defaultAddOn
值是可选的,但添加该值后,在创建与插件关联的新内容时,XF 管理面板中会自动填充指定的插件。
除了上述内容外,您可能还需要添加一些额外的配置,特别是如果您使用多个 XF 安装。
这将禁用从您的论坛发送的所有邮件。如果您使用的是带有真实用户和真实电子邮件地址的实时数据副本(尽管我们建议不要这样做!),这一点尤其重要。
作为直接禁用邮件的替代方案,您可能需要考虑使用诸如 MailTrap.io 之类的服务。这为您提供了一个免费的邮箱,可以接收从您的论坛发送的所有电子邮件,这对于测试新插件可能发送的任何电子邮件非常有用。
如果您在同一域上使用两个或更多 XF 安装,可能会遇到 cookie 被覆盖的问题,这是由于安装共享相同的 cookie 前缀所致。因此,建议确保为您设置的每个 XF 安装更改 cookie 前缀。如果不这样做,您将遇到问题,例如在登录另一个 XF 安装时从一个 XF 安装中注销。
防止动态 IP 用户频繁注销#
XenForo 会话通常绑定到您的 IP 地址。如果您的 IP 地址是动态的,或者您使用 VPN、代理或负载均衡器,您可能会频繁注销。您可以通过在 src/config.php
文件中添加以下内容来防止这种情况:
$c->extend('session', function(\XF\Session\Session $session)
{
$session->setConfig([
'ipv4CidrMatch' => 0,
'ipv6CidrMatch' => 0
]);
return $session;
});
警告
您永远不应将上述代码应用于实时/生产站点的配置。
开发命令#
XF 2.0 附带了许多通用的开发和插件 CLI 命令,旨在帮助您更高效地开发,甚至可能自动化/脚本化一些常见流程。
在本节中,我们将介绍一些常用工具并解释它们的作用。
插件特定命令#
创建新插件#
xf-addon:create
命令是初始设置和创建新插件的方式。运行后,您只需回答一些基本问题:
- 输入此插件的 ID
- 输入标题
- 输入版本 ID(例如 1000010)
- 输入版本字符串(例如 1.0.0 Alpha)
然后,您将获得创建插件并写出其 addon.json
文件的选项,并询问您是否要添加 Setup.php
文件。
导出 _data .XML 文件#
此命令用于将插件的所有数据导出到 _data
目录中的 XML 文件。它从数据库中当前的数据导出(而不是从开发输出文件导出)。
提升插件版本#
注意
如果您的版本字符串包含空格,则需要用引号括起来。
此命令接受插件的 ID、新版本 ID 和新版本字符串。这使您能够一步提升插件的版本,而无需自己执行升级和重建。上述选项是可选的,如果未提供,系统将提示您输入。如果仅指定版本 ID,我们将尝试根据 推荐的版本 ID 格式 自动推断正确的版本字符串。命令完成后,它会自动更新 addon.json
文件和数据库中的版本详细信息。
将 addon.json 同步到数据库#
有时您可能更喜欢直接编辑 JSON 文件以添加某些详细信息。这可能是版本、新图标或标题或描述的更改。以这种方式更改 JSON 可能会导致插件系统认为有待处理的更改或插件可升级。如果您尚未导出当前数据,则重建或升级可能是破坏性操作。因此,建议运行此命令作为导入数据的方式,而不会影响现有数据。
验证 addon.json 文件#
如果您想检查 JSON 文件是否包含正确的内容和格式,您现在可以验证它。验证器将检查内容是否可以解码,是否包含所有正确的必填字段(例如标题和版本 ID),并检查可选键(例如描述和图标)的存在。如果缺少任何键,系统将为您提供修复问题的选项。我们还会检查 JSON 文件中是否存在意外字段。这些可能是故意的或代表拼写错误。您可以手动运行该命令,或者在构建发布时自动运行该命令。
运行特定的安装步骤#
有时,检查您的安装类步骤是否正常运行很有用,而无需经历卸载和重新安装的过程。
有三个命令可以帮助解决这个问题。这些命令仅适用于使用默认 StepRunner
特性构建的安装类。
运行安装步骤#
运行升级步骤#
运行卸载步骤#
构建插件发布#
完成所有艰苦的工作后,在真正发布之前还需要经历许多其他流程,这很遗憾。即使是将所有文件收集到正确的位置并手动创建 ZIP 文件的过程也可能耗时且容易出错。我们可以通过一个简单的命令自动处理这些问题,包括生成 hashes.json
文件。
运行此命令时,它将首先运行 xf-addon:export
命令,然后将所有文件收集到一个临时的 _build
目录中,并将它们写入 ZIP 文件。完成的 ZIP 文件还将包含 hashes.json
文件。创建 ZIP 后,它将保存到您的 _releases
目录中,并命名为 <ADDON ID>-<VERSION STRING>.zip
。
自定义构建过程#
除了创建发布 ZIP 文件外,您可能还希望在 ZIP 中包含其他文件,或者运行其他更高级的构建过程,例如压缩或连接 JS 或运行某些 shell 命令。所有这些都可以在您的 build.json
文件中处理。这是一个典型的 build.json
文件:
{
"additional_files": [
"js/demo/portal"
],
"minify": [
"js/demo/portal/a.js",
"js/demo/portal/b.js"
],
"rollup": {
"js/demo/portal/ab-rollup.js": [
"js/demo/portal/a.min.js",
"js/demo/portal/b.min.js"
]
},
"exec": [
"echo '{title} version {version_string} ({version_id}) has been built successfully!' > 'src/addons/Demo/Portal/_build/built.txt'"
]
}
如果您有需要在插件目录之外提供的资源(例如 JavaScript),您可以使用 build.json
中的 additional_files
数组告诉构建过程复制文件或目录。在开发过程中,并不总是可以将文件保留在插件目录之外,因此如果您愿意,可以将文件保留在插件的 _files
目录中。复制附加文件时,我们将首先检查该目录。
如果您随插件提供了一些 JS 文件,您可能希望出于性能原因压缩这些文件。您可以在 build.json
中指定要压缩的文件。您可以将这些文件列为数组,或者只需指定为 '*'
,这将压缩 js
目录中的所有文件,只要在复制附加文件到构建后该路径中包含 JS 文件。任何压缩的文件将自动具有 .min.js
后缀,而不是 .js
,原始文件仍将包含在包中。
您可能更喜欢将多个 JS 文件合并为一个文件。如果是这样,您可以使用 rollup
数组来定义。键是生成的组合文件名,数组中的项目是将组合到单个文件中的 JS 文件的路径。
最后,您可能有一些需要在包构建和完成之前运行的特定过程。这可能是任何组合。最终,如果它是可以从 shell 运行的命令(包括 PHP 脚本),则可以在此处指定。上面的示例当然相当无用,但它确实至少演示了可以使用某些占位符。这些占位符将替换为可以从 XF\AddOn\AddOn
对象获取的标量值,通常是 addon.json
文件中可用的任何值,或 AddOn
实体。
开发命令#
实际上有很多与开发相关的命令,但这里仅介绍最重要的两个。
要使用这些命令中的任何一个,您必须在 config.php
文件中启用 开发模式。
警告
如果数据库和 _output
目录不同步,以下两个命令都可能导致数据丢失。始终建议使用 VCS(版本控制系统),例如 GitHub 来减轻此类错误的影响。
导入开发输出#
运行此命令将从插件 _output
目录导入所有开发输出文件到数据库中。
导出开发输出#
这将导出数据库中当前与插件关联的所有数据到 _output
目录中的文件。
调试代码#
应该可以设置您最喜欢的调试器工具(XDebug、Zend Debugger 等)以与 XF2 一起使用。不过,有时调试代码可能就像快速查看变量在给定时间持有的值(或值类型)一样简单。
转储变量#
PHP 当然有一个内置工具来处理这个问题。您可能知道它是 var_dump()
。XF 附带了两个替代方案:
简单版本主要只是以纯文本形式转储变量的值。例如,如果您仅使用它来转储数组的值,您将在页面顶部看到如下输出:
这实际上与标准 var_dump 的输出相同,但经过稍微修改以提高可读性,并包装在 <pre>
标签内以确保渲染时保留空白。
替代方案实际上是 Symfony 项目中的一个名为 VarDumper 的组件。它输出 HTML、CSS 和 JS 以创建更具功能性和可能更易读的输出。它允许您折叠某些部分,并且对于某些可以输出大量数据的值(例如对象),它可以自动折叠这些部分。