除了 Web 框架之外,CakePHP 还提供了一个控制台框架来创建命令行工具和应用程序。控制台应用程序非常适合处理各种利用现有应用程序配置、模型、插件和域逻辑的后台和维护任务。
CakePHP 提供了几个控制台工具,用于与 CakePHP 功能(如 i18n 和路由)进行交互,使您能够深入了解您的应用程序并生成相关文件。
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 将自动发现应用程序及其插件中的所有命令。在构建独立控制台应用程序时,您可能希望减少公开的命令数量。您可以使用您的 Application
的 console()
钩子来限制哪些命令被公开以及重命名公开的命令
// 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;
}
}
在上面的示例中,唯一可用的命令将是 help
、version
和 user
。有关如何在插件中添加命令,请参见 命令 部分。
注意
当添加使用相同 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
事件来修改可用的命令。
有关如何创建第一个命令,请参见 命令对象 章。然后了解有关命令的更多信息
在命令行界面 (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 有效,并且适合发送电子邮件的域名。