控制台命令

除了 Web 框架之外,CakePHP 还提供了一个控制台框架来创建命令行工具和应用程序。控制台应用程序非常适合处理各种利用现有应用程序配置、模型、插件和域逻辑的后台和维护任务。

CakePHP 提供了几个控制台工具,用于与 CakePHP 功能(如 i18n 和路由)进行交互,使您能够深入了解您的应用程序并生成相关文件。

CakePHP 控制台

CakePHP 控制台使用一种调度器类型的系统来加载命令、解析其参数并调用正确的命令。虽然以下示例使用 bash,但 CakePHP 控制台与任何 *nix shell 和 Windows 兼容。

CakePHP 应用程序包含 **src/Command** 目录,其中包含其命令。它还在 **bin** 目录中附带一个可执行文件

$ cd /path/to/app
$ bin/cake

注意

对于 Windows,命令需要是 bin\cake(注意反斜杠)。

在没有参数的情况下运行控制台将列出可用的命令。然后,您可以使用其名称运行任何列出的命令

# run server command
bin/cake server

# run migrations command
bin/cake migrations -h

# run bake (with plugin prefix)
bin/cake bake.bake -h

如果命令的名称与应用程序或框架命令不重叠,则可以不使用插件前缀来调用插件命令。如果两个插件提供了名称相同的命令,则第一个加载的插件将获得短别名。您始终可以使用 plugin.command 格式来明确地引用命令。

控制台应用程序

默认情况下,CakePHP 将自动发现应用程序及其插件中的所有命令。在构建独立控制台应用程序时,您可能希望减少公开的命令数量。您可以使用您的 Applicationconsole() 钩子来限制哪些命令被公开以及重命名公开的命令

// in src/Application.php
namespace App;

use App\Command\UserCommand;
use App\Command\VersionCommand;
use Cake\Console\CommandCollection;
use Cake\Http\BaseApplication;

class Application extends BaseApplication
{
    public function console(CommandCollection $commands): CommandCollection
    {
        // Add by classname
        $commands->add('user', UserCommand::class);

        // Add instance
        $commands->add('version', new VersionCommand());

        return $commands;
    }
}

在上面的示例中,唯一可用的命令将是 helpversionuser。有关如何在插件中添加命令,请参见 命令 部分。

注意

当添加使用相同 Command 类的多个命令时,help 命令将显示最短的选项。

重命名命令

在某些情况下,您需要重命名命令以创建嵌套命令或子命令。虽然默认的命令自动发现不会执行此操作,但您可以注册您的命令以创建任何所需的命名。

您可以通过在插件中定义每个命令来自定义命令名称

public function console(CommandCollection $commands): CommandCollection
{
    // Add commands with nested naming
    $commands->add('user dump', UserDumpCommand::class);
    $commands->add('user:show', UserShowCommand::class);

    // Rename a command entirely
    $commands->add('lazer', UserDeleteCommand::class);

    return $commands;
}

在覆盖应用程序中的 console() 钩子时,请记住调用 $commands->autoDiscover() 以添加来自 CakePHP、您的应用程序和插件的命令。

如果您需要重命名/删除任何附加的命令,您可以在应用程序事件管理器上使用 Console.buildCommands 事件来修改可用的命令。

命令

有关如何创建第一个命令,请参见 命令对象 章。然后了解有关命令的更多信息

CakePHP 提供的命令

控制台环境中的路由

在命令行界面 (CLI) 中,尤其是您的控制台命令中,env('HTTP_HOST') 和其他与 Web 浏览器相关的环境变量未设置。

如果您生成使用 Router::url() 的报告或发送电子邮件,这些报告或电子邮件将包含默认主机 https://127.0.0.1/,从而导致 URL 无效。在这种情况下,您需要手动指定域名。您可以通过使用引导程序或配置中的 Configure 值 App.fullBaseUrl 来实现,例如。

对于发送电子邮件,您应该为 Email 类提供您希望发送电子邮件的主机

use Cake\Mailer\Email;

$email = new Email();
$email->setDomain('www.example.org');

这断言生成的邮件 ID 有效,并且适合发送电子邮件的域名。