namelesscoder / rpc
This package is auto-updated.
Last update: 2024-09-12 03:46:10 UTC
README
将 TYPO3 程序作为任务公开,并接受并响应用户端发送的 RPC 查询。使用请求/响应的通信方式,其中非常简单的请求包含任务的参数,而更复杂的响应允许返回标准响应,还可以返回客户端在请求用户填写任务所需参数时显示的表单字段定义。
这还允许 RPC 请求/响应分多步进行。例如,服务器可以发送一个响应,要求填写一个变量,然后将该变量发送到服务器,服务器根据该变量返回一个新的响应。直到所有参数都填写完毕,任务可以执行。
RPC 扩展具有与任何 Mac(el Capitan 及以上版本)和 iPhone/iPad 兼容的 OSX 和 iOS 客户端。iOS 版本仍在开发中,尚未发布。一旦所有客户端都完成,计划发布到官方应用商店;在此之前,OSX 客户端可以作为 DMG 存档下载(见下文)。
安装
使用 composer require namelesscoder/rpc
在需要 RPC 的 TYPO3 网站上将其作为 composer 依赖项拉取。
下载并安装 OSX 或 iOS 应用程序 "TYPO3 RPC 客户端"。
- OSX 应用程序(DMG)。挂载,复制应用程序,首次运行时,右键单击并选择“打开”以确认运行未签名的应用程序(直到通过应用商店分发,然后应用程序将被签名)
- iOS 应用程序(即将推出)
或者安装扩展,并从客户端 TYPO3 网站使用后端模块连接到 TYPO3 服务器主机。
工作原理
如果您是系统管理员
- 您安装扩展,这将自动使 HTTP 端点对客户端可用
- 客户端使用站点的主机名连接到您的站点
- 当客户端首次连接时,它没有令牌 - 为它创建一个令牌,并将客户端存储/报告令牌给用户。令牌在 TYPO3 的根系统文件夹(pid 零)中创建为一个记录,处于非活动状态,锁定到客户端 IP 地址,直到验证。
- 用户现在向您报告他的令牌,您定位令牌记录。
- 编辑令牌记录,打开“是否有访问权限?”开关,并分配所需的任务访问权限。
- 客户端现在可以(重新连接并)执行可访问的任务。
如果您是 RPC 客户端用户
- 打开客户端(应用程序或后端模块)并创建新的连接
- 输入要连接的站点的主机名作为主机名
- 按下“连接”图标/按钮
- 如果是第一次连接,将请求并报告一个令牌。然后您将此令牌报告给系统管理员(通常几个字符就足以识别它),系统管理员授予您所需的访问权限。在令牌验证后重新连接。
- 如果您有访问权限,将呈现给您一个任务列表。点击任务开始执行它,客户端应用程序/模块将沿途显示表单字段和反馈。
配置
包含一系列任务,可以通过 PHP API 进行配置
\NamelessCoder\Rpc\Manager\TaskManager::getInstance() ->getTaskById('help') ->getTaskConfiguration() ->setEnabled(FALSE)
并且可以通过相同的 API 添加和操作新的自定义任务
\NamelessCoder\Rpc\Manager\TaskManager::getInstance()->addTask( new \MyNamespace\MyExtension\MyCustomTask('my-custom-task') ); \NamelessCoder\Rpc\Manager\TaskManager::getInstance() ->getTaskById('my-custom-task') ->doSomethingToTask();
内置任务包括
list
,如果要从客户端使用RPC,并且任务在执行之前被列出,则必须可用。如果没有这个任务,客户端必须知道将要调用的任务ID,而无需从服务器接收它。OSX/iOS客户端不支持这种操作模式,但自定义实现可以这样做。为了使OSX/iOS客户端能够工作,必须启用并可访问list
。help
,不出所料,返回关于RPC如何从用户角度工作的帮助信息。如果您的用户不需要帮助文本,则可以禁用此任务或简单地选择不授予其访问权限。任务将此扩展中的CLIENT.md
内容作为响应显示在客户端。demo
,它既提供了演示任务基本功能的方式,也提供了快速参考,以制作常见的任务类型。- 为TYPO3提供的唯一相关命令控制器编写的
command
任务:扩展安装和卸载。
除此之外,还提供了一个通用的command
任务,可用于将单个命令控制器显示为任务,从而让您可以精确控制哪些任务可以使用——在不需要对所有命令的全球访问的情况下。此通用任务按照以下方式为每个命令控制器启用
\NamelessCoder\Rpc\Implementation\Task\CommandTask::registerForCommand( \TYPO3\CMS\Extensionmanager\Command\ExtensionCommandController::class, 'install' )->setFieldTypeForArgument( \NamelessCoder\Rpc\Implementation\Field\AvailableExtensionsField::class, 'extensionKey' ); \NamelessCoder\Rpc\Implementation\Task\CommandTask::registerForCommand( \TYPO3\CMS\Extensionmanager\Command\ExtensionCommandController::class, 'uninstall' )->setFieldTypeForArgument( \NamelessCoder\Rpc\Implementation\Field\InstalledExtensionsField::class, 'extensionKey' );
此示例展示了如何注册扩展安装和卸载命令。两者都使用自定义字段类型作为extensionKey
参数的值 - 字段以弹出菜单字段的形式提供已安装或未安装的扩展键。通用任务的基本代码负责检测参数并在控制器上调用操作。使用相同的方法为您的命令控制器,为每个您希望公开为RPC的操作创建一个。
在TYPO3中,创建您的RPC任务作为命令控制器并使用命令控制器任务公开通常是很有意义的。这使得任务可以通过计划程序、命令行和通过RPC客户端运行。然而,对于更复杂的任务,例如需要通过多个步骤填写大量输入参数或在完成后需要自定义报告的任务,您必须考虑创建自己的RPC任务类 - 参见demo
任务的类以获取快速参考。
请参阅下文中的“已知限制”:命令控制器旨在用于BE上下文,但在这种方式执行时实际上将具有FE上下文。并非所有命令控制器都支持此操作,并且某些可能需要您将TS从module.tx_yourext.*
复制到plugin.tx_yourext.*
,因为上下文不同。
功能完整性
以下是一个功能列表,其中一些已经实现,一些计划在未来的RPC扩展和互补的OSX/iOS客户端应用程序版本中实现
通用功能
- 创建自定义任务的基础
- 客户端OSX应用程序(El Capitan及以上版本)
- 客户端iOS应用程序
- 客户端TYPO3后端模块
- 对单个字段、整体参数或任务执行后的成功/错误报告的支持
- 支持分步填写参数,一次填写一个或多个参数
- 重复之前的命令,使用收集到的参数
- 每个连接的收藏命令+参数存储
- 支持条件参数值(通过多步骤实现,其中字段的值取决于之前的字段)
- CommandController集成以执行任意已注册为RPC的TYPO3 CLI命令
- 支持从命令行执行TYPO3RPC以在指定的远程服务器上调用任务
组件类型
- 标准
<input type="text" />
等效 - 结合
<input type="text" />
自由输入和<select>
预设值等价 - 日期选择器
<input type="text" />
等价于弹出式日期选择 - 数字选择器
<input type="text" />
等价于值增减控制 - 全文
<textarea>
等价- 支持OSX/iOS的富文本格式
- HTML客户端支持RTF
- 标准
<input type="checkbox" />
等价 - 标准
<input type="radio" />
等价 - 标准
<select>
等价- 支持单选选项
- 支持多选选项
- 支持父子树选择(自定义HTML组件等价)
- 文件选择字段
有效载荷特性/支持
- 标量值以字符串形式输出
- 支持递归数组输出(表格)
- 识别URL并显示链接
- 以下载形式显示二进制有效载荷值(文件、blob)
请求/响应特性
- 支持基本参数(单维数组)
- 支持从客户端传输文件
已知限制
没有什么是完美的,这个包也不例外。我是Swift语言的初学者(这些实际上是我第一次编写的OSX和iOS应用程序,没有使用像PhoneGap这样的工具)。
限制包括
- RPC客户端通过主机名调用远程,这涉及到TYPO3如何解析页面ID(以及TS配置等)。这是多站设置中潜在陷阱,特别是结合使用TS或其他页面特定配置的自定义任务。一种可能的解决方案是,使用相同的令牌在多个主机名上创建到同一远程的多个连接,因为令牌是全局的。
- 由于OSX和iOS平台的安全设置,这些客户端仅支持HTTPS。我认为这只有好处,但最好能提供作为选项,供无法使用HTTPS且以其他方式处理安全的人员使用。
- OSX和iOS客户端仅支持平台的最新版本。这是一个有意识的决定 - 以避免处理遗留问题。
- 组件选择目前有限。例如,没有允许输入多个值的组件(除非当然你构建一个任务来接受CSV值)。尽管我已经学到了很多关于如何在Swift中实现动态表单字段的知识,但我还需要更多经验才能有信心做到这一点。
- TYPO3 CommandController集成可能与某些CommandController不兼容。最重要的是,存在不同的上下文,即 TYPO3 CLI模式标志将不会设置,并且 TYPO3上下文将是前端(而不是CLI上运行CommandController时的后端)。
不使用TYPO3的使用
包清单没有明确要求TYPO3作为依赖项。实际上,您可以通过将其作为composer依赖项安装,并手动构建入口点(如果需要,在另一个框架内部)来使用此包而不使用TYPO3。
为此,您需要
- 在请求分发之前,使用
NamelessCoder\Rpc\Manager\TaskManagerInterface
的实现并使用NamelessCoder\Rpc\Manager\TaskManager::setInstance($instance);
注册。 - 在请求分发之前,使用
NamelessCoder\Rpc\Manager\ClientManagerInterface
的实现并使用NamelessCoder\Rpc\Manager\ClientManager::setInstance($instance);
注册。 - 入口点,它使
NamelessCoder\Rpc\RequestDispatcher
实例调用handleIncomingRequest
在TYPO3内部使用时,该包注册了与TYPO3兼容的实现。在外部使用时,您必须手动注册与您想要使用RPC的存储/框架兼容的实现。
包含的 list
、help
和 demo
任务可以在任何地方使用 - commands
和 command
实现只能与 TYPO3 一起使用(但是可以为其他框架的命令创建类似的任务)。