【问题标题】:CakePHP 3.7 Shell commands inside a plugin couldn't execute插件内的 CakePHP 3.7 Shell 命令无法执行
【发布时间】:2019-11-17 20:11:14
【问题描述】:
namespace Admin\Shell;
use Cake\Console\Shell;
class AdminAlertShell extends Shell{
  ...
  ...
}

这里的“Admin”是插件,所以我在插件文件夹结构中创建了这个文件。 文件路径:/plugins/Admin/src/Shell/AdminAlertShell.php

试图在 CLI 中运行它

bin/cake admin_alert

但是抛出异常

例外:未知命令cake admin_alert。运行cake --help 以获取有效命令列表。在 [localpath/vendor/cakephp/cakephp/src/Console/CommandRunner.php,第 346 行]

它正在工作。但我不知道这是怎么回事。我已将 cakephp 3.5 升级到 3.7。但是,我不确定这是否会导致问题。

【问题讨论】:

  • CakePHP 从 3.6 开始贬低使用 shell。在他们的文档book.cakephp.org/3.0/en/console-and-shells/commands.html 中,他们提到了以下“3.6.0 版中的新功能:添加了命令来长期替换 Shell。Shell 和任务有几个在不破坏兼容性的情况下很难纠正的缺点。”
  • @HasnatSafder 感谢您的快速回复。是的,它正在贬值。但它在插件之外工作正常。只有当我将它放在插件文件夹中时才会出现问题。当我在插件中创建命令文件夹时,抛出异常“找不到命令”。
  • 在使用 CakePHP 3.6 以后的版本时,我从未读过关于在主 src/commands 目录之外使用命令的信息。
  • 可能无法找到/访问您的文件/类,例如由于权限问题或拼写错误,或者您的插件未加载(检查您的 Application 类的引导程序)。跨度>
  • @ndm 它工作正常。所以没有拼写错误或插件不加载问题的机会。感谢您的帮助。

标签: cakephp-3.7


【解决方案1】:

我刚刚在我的项目中找到了问题的根源。

在我的插件里面有一个文件:src/Plugin.php

在这个类里面有以下几行代码:

/**
 * @inheritDoc
 */
public function console(CommandCollection $commands): CommandCollection
{
    // Add console commands here.
    return $commands;
}

这可能是通过烘焙生成的。

我看到没有调用父级。在父路径中添加。

将此方法更改为如下所示:

/**
 * @inheritDoc
 */
public function console(CommandCollection $commands): CommandCollection
{
    // Add console commands here.
    $commands = parent::console($commands);
    return $commands;
}

现在调用父级并将路径添加到命令集合中。

作为旁注,我还看到中间件没有调用它的父级。

认为修复这个问题也是个好主意。

作为替代方案,您可以只清除类并应使用所有默认值。

希望这可以节省我花费大量时间来解决这个问题的时间。

【讨论】:

  • 我刚刚检查了最新的烘焙模板,看到控制台方法被删除,但中间件方法仍然存在。我检查了中间件源,发现它只返回中间件对象,所以不需要调用父对象
猜你喜欢
  • 2020-05-19
  • 2013-09-06
  • 2022-01-23
  • 1970-01-01
  • 2019-10-12
  • 2016-01-01
  • 2018-12-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多