shel / neos-terminal
Neos CMS UI 终端,用于运行 Eel 表达式和其他命令
Requires
- php: >=8.1
- neos/neos: ^8.3
- neos/neos-ui: ^8.3
- symfony/console: ^4.2 || ^5.1
Suggests
- shel/neos-commandbar: The terminal provides a plugin integration for the Neos command bar
This package is auto-updated.
Last update: 2024-09-18 09:10:46 UTC
README
此包为 Neos CMS UI 提供了一个终端仿真插件。提供了一些命令以在 Neos CMS 项目的开发与调试过程中节省时间。
所有命令及其输出也自动在浏览器开发控制台中以 NeosTerminal
的形式可用,便于处理 JSON 结果和持久历史。
它使用了 Linus Willner 的优秀 终端组件。
快速概述
- 通过 Neos UI 或浏览器控制台运行命令
- 评估当前选中页面和内容上的 Eel 表达式
- 通过节点属性搜索节点
- 刷新缓存
- 修复节点
- 命令名称自动完成
- 通过
t+t
快捷键打开终端 - 限制命令到后端角色
- 创建您自己的命令并在自己的包中提供它们
- 完全支持 Shel.Neos.CommandBar
外观
观看 视频
安装
在您的 Neos 项目中运行以下命令
composer require shel/neos-terminal
支持的 Neos 版本
由于需要 React 功能,终端 UI 集成仅适用于提供 React >= 16.8 的较新 Neos 版本。但即使 React 版本太旧,命令仍然注册并通过 NeosTerminal
全局窗口对象可用。
使用方法
有三种方式可以访问终端功能
- 点击 Neos 后端顶部菜单栏中的终端图标以打开终端。
- 使用
t t
快捷键打开终端(通过Settings.yaml
中的 Neos 快捷键 API 配置)。 - 通过全局
NeosTerminal
对象从浏览器开发控制台访问终端命令。
现在您可以运行提供的任何命令,或您自己的命令。
包含的命令
可用的默认命令
eel
- Eel 表达式解析器flushCache
- 刷新一个或所有 Neos/Flow 缓存help
- 显示命令列表及其参数clear
- 清除终端search
- 通过属性搜索节点nodeRepair
- 修复节点
您可以添加 自定义命令。
Eel 评估器
eel
命令允许您运行任何 Eel 表达式。
您可以运行简单的表达式
eel 5+2
读取特定设置
eel Configuration.setting('Neos.Flow.core.context')
获取所有 Eel 辅助函数的列表
eel Configuration.setting('Neos.Fusion.defaultContext')
或更复杂的表达式。以下调用将返回主页所有子页面的标签
eel Array.map(q(site).children().get(), page => page.label)
默认情况下,当前 site
、documentNode
和当前选中的 node
在您的表达式上下文中可用。
注意: 命令将对结果执行一些转换
- 如果结果是节点或节点列表,则每个节点将替换为其
properties
列表。 - 属性是对象的,则替换为其类名。
这将在未来的版本中得到优化,并应该提高输出的可读性。
刷新缓存
flushCache
命令允许您刷新所有缓存或单个缓存。
例如,以下调用将刷新融合渲染缓存
flushCache Neos_Fusion_Content
如果省略缓存标识符,则刷新所有缓存。
请仅在绝对必要时使用此命令。缓存问题可以在实现中进行修复。
修复节点
nodeRepair
命令允许您通过节点类型修复节点。它使用与 ./flow node:repair
CLI 命令相同的插件和方法。
例如,以下调用将移除 Neos 示例文本节点中的未定义属性
nodeRepair removeUndefinedProperties Neos.NodeTypes:Text
您也可以通过添加 -d
选项进行干运行,看看该方法会做什么
nodeRepair --dryRun removeUndefinedProperties Neos.NodeTypes:Text
要按工作空间过滤,可以添加工作空间名称
nodeRepair --workspace user-admin removeUndefinedProperties Neos.NodeTypes:Text
警告:一些修复方法在通过 CLI 运行时会要求您进行确认。目前它们将在不要求确认的情况下执行。
配置
在生产环境中启用插件
默认情况下,该插件仅在 开发 环境中加载。如果您想将其激活在 生产 中,您必须覆盖您的 Settings.yaml
中的设置
Neos: Neos: Ui: frontendConfiguration: 'Shel.Neos.Terminal:Terminal': enabled: true
安全性
在 Neos 后端执行命令会打开一个可能的安全风险。
因此,如果您在生产环境中使用此插件,请确保只有有限数量的用户可以访问它。
当创建自己的命令时,请记住确保数据库或其他系统不会发生任何不良情况。
示例:如果您有自己的 Eel 辅助程序,可以发送 API 请求到另一个具有完全写访问权限的系统,如果足够权限的后端用户被黑客攻击,这可能会被滥用。
主题
请查看此包中的 Settings.yaml 和其 frontendConfiguration
。它允许您使用自己的主题覆盖主题。
命令策略
默认情况下,任何 管理员 都可以完全访问所有现有和添加的命令。
此外,存在一个名为 Shel.Neos.Terminal:TerminalUser
的角色,默认情况下只能运行 eel
命令。您可以向此角色添加更多权限,以允许更多命令,并将其分配给用户或作为其他角色的 parentRole
。请参阅此包中的 Policy.yaml 中的示例。
添加自己的命令
添加自己的命令只需要几个步骤(具体取决于您计划做什么)。
创建一个名为 MyCommand
的新类,并实现此包中的 TerminalCommandControllerPluginInterface
或从 AbstractTerminalCommand
继承。一旦实现了所有必需的方法,您就可以开始了!
例如,您可以使用以下类创建一个显示每日笑话的命令。只需根据您的包密钥调整命名空间即可。
<?php declare(strict_types=1); namespace Vendor\Package\Command; use Neos\Flow\Http\Client\Browser; use Neos\Flow\Http\Client\CurlEngine; use Shel\Neos\Terminal\Domain\CommandContext; use Shel\Neos\Terminal\Domain\CommandInvocationResult; use Shel\Neos\Terminal\Command\TerminalCommandInterface; class JokeCommand implements TerminalCommandInterface { public static function getCommandName(): string { return 'jod'; } public static function getCommandDescription(): string { return 'Joke of the day'; } public static function getCommandUsage(): string { return 'jod [<string>]'; } public function invokeCommand(string $argument, CommandContext $commandContext): CommandInvocationResult { $browser = new Browser(); $browser->setRequestEngine(new CurlEngine()); $jokeResponse = json_decode($browser->request('https://api.jokes.one/jod')->getBody()->getContents()); $joke = $jokeResponse->contents->jokes[0]->joke; $result = $joke->title . ': ' . $joke->text; return new CommandInvocationResult(true, $result); } }
您创建了哪些有用的命令?请发送包含 PHP 类或链接到您存储库的 gist 链接,我们可以将其添加到文档中。
向 Neos UI 提供反馈
Neos UI 支持 ServerFeedbacks
。这些通常用于在操作节点和文档后触发节点和文档的重新加载或更改节点状态。
您可以将这些反馈添加到 CommandInvocationResult
。
触发节点更新执行后 Neos UI 客户端框架重新加载的调用方法示例如下
public function invokeCommand(string $argument, CommandContext $commandContext): CommandInvocationResult { $newNodeTitle = $argument; $commandContext->getFocusedNode()->setProperty('title', $newNodeTitle); $result = 'I updated the node title'; $feedback = [ new \Neos\Neos\Ui\Domain\Model\Feedback\Operations\ReloadDocument() ]; return new CommandInvocationResult(true, $result, $feedback); }
如果您有具有自己注册反馈的 Neos UI 插件,您也可以触发它们。
在其他包中提供命令
如果你的包提供了一个命令,你应当在定义命令时检查终端是否已安装在你的代码中。
为了实现这一点,你需要将命令类包装在条件中,并使用完全限定名来引用终端包中的类和接口。
if (interface_exists('Shel\Neos\Terminal\Command\TerminalCommandInterface', false)) { class JokeCommand implements \Shel\Neos\Terminal\Command\TerminalCommandInterface { public static function getCommandName(): string { ... } public static function getCommandDescription(): string { ... } public static function getCommandUsage(): string { ... } public function invokeCommand(string $argument, \Shel\Neos\Terminal\Domain\CommandContext $commandContext): \Shel\Neos\Terminal\Domain\CommandInvocationResult { ... return new \Shel\Neos\Terminal\Domain\CommandInvocationResult(true, $result); } } } else { class JodCommand {} }
支持此插件/如何去除赞助徽章
创建和维护此类插件需要花费大量时间。因此,我决定添加一个微小的烦人徽章来推广对我的工作的财务支持。
有几种方法可以去除终端中的小赞助徽章。
作为回报,你会感觉好很多,你将获得一个可以放入设置的注册密钥,这将禁用提到的徽章。
这将帮助我进一步开发这个和其他插件。当然,我也会尽我最大的努力快速响应用户的问题和疑问。
还有第四种方法:fork这个仓库并修补验证检查(或者你可能找到的任何其他方法)。当然你可以这么做。但你会得到不好的 karma,而且你不会帮助这个插件的未来。
如果这个徽章没有让你烦恼,那也行。保留它,享受插件吧 :)
贡献
非常欢迎贡献。
对于代码贡献,请创建一个fork,并为当前维护的最低分支(目前是master)创建一个PR。
- 请确保不要将任何生成文件包含在你的更改中的
/Resources/Public/
中。 - 请在你的提交中提供关于你更改的详细说明,并确保提交信息格式良好。
运行测试
确保你在composer.json
中包含了所需的behat依赖项,并运行以下命令
FLOW_CONTEXT=Testing bin/phpunit -c Build/BuildEssentials/PhpUnit/FunctionalTests.xml Packages/Plugins/Shel.Neos.Terminal/Tests/Functional
许可证
见许可证