命令行界面

Introduction

Winter 包括几个命令行界面 (CLI) 命令和实用程序,允许安装和管理 Winter 及其插件和主题,执行站点维护并加快开发过程。控制台命令通过 Laravel 的执行Artisan 命令行工具。

通过使用终端或 shell 并在项目的根文件夹中运行以下命令来执行命令:

php artisan [command]

您可以通过不向 Artisan 工具提供任何命令来获取可用命令的列表:

php artisan

如果您需要帮助或每个命令的可用参数和选项列表,只需在命令后加上--help 旗帜:

php artisan [command] --help

自动完成/建议的输入值

随着升级到 Laravel 9 / Symfony 6,添加了支持 命令能够向 shell 提供制表符自动完成结果,以改善用户体验。大多数 Winter 命令都提供开箱即用的输入值自动完成支持,并且很容易在您自己的自定义命令中添加支持 当延长Winter\Storm\Console\Command 基类。

此功能要求您在 shell 中运行一次命令,以便为所有 Laravel / Winter 控制台命令启用它:

php artisan completion --help

刚跑artisan completion 将生成需要导入到您的 shell 中的 shell 脚本,以便启用对 Winter / Laravel 命令的自动完成支持;通过--help flag 将提供有关如何安装生成的脚本的详细说明。

可用命令列表

以下命令可用于每个Winter安装。单击命令名称可查看有关该命令用法的更多信息。

Command Description
设置与维护
winter:install 通过命令行安装 Winter。
winter:update 使用更新 Winter 及其插件Marketplace 通过命令行。
winter:up 运行数据库迁移。
winter:passwd 更改管理员密码。
winter:env 使用Winter的环境文件和配置。
winter:version 显示正在使用的 Winter 版本。
winter:fresh 删除演示插件和主题。
winter:mirror 在另一个目录中镜像可公开访问的文件。
插件管理
plugin:install 下载并安装Winter插件。
plugin:list 列出已安装的插件。
plugin:rollback 回滚插件及其数据库表。
plugin:refresh 回滚插件及其数据库表,并重新运行所有更新。
plugin:disable 禁用插件。
plugin:enable 启用插件。
plugin:remove 删除插件。
主题管理
theme:install 下载并安装Winter主题。
theme:list 列出可用的主题。
theme:use 将 Winter 切换到给定的主题。
theme:remove 删除主题。
theme:sync 在文件系统和数据库之间同步一个主题,如果你使用数据库模板 特征。
资产编译(混合)
mix:install 为已注册的 Mix 包安装 Node 依赖项。
mix:update 更新已注册 Mix 包的节点依赖项。
mix:list 列出所有已注册的 Mix 包。
mix:compile 编译一个或多个 Mix 包。
mix:watch 观察 Mix 包内的变化,并在任何变化时自动编译包。
mix:run 在给定包中运行脚本。
Scaffolding
create:command 在插件中创建控制台命令类。
create:component 在插件中创建一个前端组件。
create:controller 在插件中创建控制器。
create:formwidget 在插件中创建一个 FormWidget。
create:job 在插件中创建一个 Job 类。
create:model 在插件中创建模型。
create:plugin 创建一个插件。
create:reportwidget 在插件中创建 ReportWidget。
create:settings 在插件中创建一个设置模型。
create:theme 创建一个主题。
Utilities
winter:test 在 Winter 和插件上运行单元测试。
winter:util Winter开发实用程序的集合。
Laravel 提供的命令
cache:clear 清除应用程序缓存。
cache:forget 从缓存中删除一个项目
clear-compiled 删除编译的类文件
config:cache 创建缓存文件以加快配置加载
config:clear 删除配置缓存文件
down 将应用程序置于维护/演示模式
env 显示当前框架环境
key:generate 设置应用程序密钥
optimize 缓存框架引导文件
package:discover 重建缓存的包清单
queue:failed 列出所有失败的队列作业
queue:flush 刷新所有失败的队列作业
queue:forget 删除失败的队列作业
queue:listen 收听给定的队列
queue:monitor 监控指定队列的大小
queue:prune-batches 从批处理数据库中删除过时的条目
queue:prune-failed 从失败的作业表中删除过时的条目
queue:restart 在完成当前作业后重新启动队列工作守护进程
queue:retry 重试失败的队列作业
queue:retry-batch 重试一批失败的作业
queue:work 作为守护进程开始处理队列中的作业
route:cache 创建路由缓存文件以加快路由注册
route:clear 移除路由缓存文件
route:list 列出所有注册的路由
schedule:finish 处理预定命令的完成
schedule:run 运行预定的命令
up 使应用程序退出维护模式
view:clear 清除所有编译的视图文件

构建命令

插件还可以提供额外的命令来增强 Winter 的额外功能。

如果你想创建一个名为myauthor:mycommand,你可以运行php artisan create:command MyAuthor.MyPlugin MyCommand 脚手架命令 这将在名为的文件中为该命令创建关联的类plugins/myauthor/myplugin/console/MyCommand.php 内容如下:

<?php namespace MyAuthor\MyPlugin\Console;

use Winter\Storm\Console\Command;

class MyCommand extends Command
{
    /**
     * @var string|null The default command name for lazy loading.
     */
    protected static $defaultName = 'myauthor:mycommand';

    /**
     * @var string The name and signature of this command.
     */
    protected $signature = 'myauthor:mycommand
        {myArgument : Command argument avaible through $this->argument("myArgument")}
        {--myOptionFlag : Defines a custom path to the "npm" binary}';

    /**
     * @var string The console command description.
     */
    protected $description = 'Install Node.js dependencies required for mixed assets';

    /**
     * Execute the console command.
     * @return int
     */
    public function handle(): int
    {
        $this->output->writeln('Hello world!');

        return 0; // return 1 if an error occurs
    }
}

创建班级后,您应该填写defaultName,signature, 和description 类的属性,将在命令上显示命令时使用list 屏幕。

handle 执行命令时将调用方法。您可以在此方法中放置任何命令逻辑。

定义输入期望

Laravel 文档 有关如何定义命令具有的输入期望(参数和选项)的信息。

定义输入的选项:

提供建议值

Winter\Storm\Console\Traits\ProvidesAutocompletion trait 提供了一个默认的实现complete() 与 Symfony 提供的 shell 输入自动完成功能交互所需的方法。这使用类似于 Eloquent 中访问器的接口简化了自定义命令所需的实现工作。

NOTE: 这个特性默认在Winter\Storm\Console\Command 基类。

为了为给定的参数或选项提供输入建议,您所要做的就是将一个方法添加到您的命令类中,该方法以以下格式命名:suggest{$inputName}[Values|Options](string $currentValue, array $currentInput): array.

为参数提供值的方法应该以Values 为选项提供值的方法应该以Options.请参阅下面的几个示例实现:

// ...

    /**
     * Example implementation of a suggestion method for the "myArgument" argument
     */
    public function suggestMyArgumentValues(string $value = null, array $allInput): array
    {
        if ($allInput['arguments']['dependent'] === 'matches') {
            return ['some', 'suggested', 'values'];
        }
        return ['all', 'values'];
    }

    /**
     * Example implementation of a suggestion method for the "package" option
     */
    public function suggestPackageOptions(string $value = null, array $allInput): array
    {
        return Package::all()->pluck('name')->all();
    }

// ...

Symfony 文档 了解更多信息。

插件名称作为参数

如果您的命令需要一个插件标识符作为其参数之一,以便确定对该特定插件采取的操作的范围,那么您可以使用System\Console\Traits\HasPluginArgument trait 以提供对所提供输入的自动验证和规范化以及对输入自动补全 特征。

只需将特征包含在您的班级中并定义plugin 作为命令签名中的参数:

use Winter\Storm\Console\Command;
use System\Console\Traits\HasPluginArgument;

class MyCommand extends Command
{
    use HasPluginArgument;

    // ...

    /**
     * @var string The name and signature of this command.
     */
    protected $signature = 'myauthor:mycommand
        {plugin : The plugin to interact with. <info>(eg: Winter.Blog)</info>}';

    // ...

    /**
     * @var string What type of plugins to suggest in the CLI autocompletion. Valid values: "enabled", "disabled", "all"
     */
    protected $hasPluginsFilter = 'enabled';

    public function handle()
    {
        // helper method that validates and normalizes the user provided input
        $pluginName = $this->getPluginIdentifier();

        // Do things with $pluginName
    }
}

检索输入

Laravel 文档 如何检索输入。

可用的输入法:

#### Confirmation via input

除了Laravel 提供的额外输入选项, 这confirmsWithInput($message, $requiredInput) 方法可用于显示警告消息和提示,要求用户输入指定的字符串以确认潜在的破坏性操作。

此功能要求您的命令包括\Winter\Storm\Console\Traits\ConfirmsWithInput 特征。

use Winter\Storm\Console\Command;
use Winter\Storm\Console\Traits\ConfirmsWithInput;

class MyCommand extends Command
{
    use ConfirmsWithInput;

    public function handle()
    {
        $pluginName = $this->argument('plugin');

        if (!$this->confirmWithInput(
            "This will remove the database tables and files for the \"$pluginName\" plugin.",
            $pluginName
        )) {
            return 1;
        }

        // Do dangerous things with $pluginName
    }
}

这将显示以下内容:

image

如果您的命令定义了一个--force 签名中的选项,则该选项可用于绕过确认步骤和生产警报。

处理过程信号

Winter\Storm\Console\Traits\HandlesCleanup trait 提供了一个默认的实现getSubscribedSignals() &handleSignal() 与 Symfony 转发的进程信号交互所需的方法。这简化了自定义命令所需的实现工作,以满足在用户以跨平台友好的方式终止命令时执行清理任务的常见要求。

NOTE:这个特性默认在Winter\Storm\Console\Command 基类。如果你想将它添加到一个不扩展这个基类的类中,你还需要实现Symfony\Component\Console\Command\SignalableCommandInterface 你班级的界面。

要利用此特性,要么扩展基础Winter\Storm\Console\Command 类或添加Winter\Storm\Console\Traits\HandlesCleanup 特征到你的班级,然后实施handleCleanup() 方法如下图:

use Winter\Storm\Console\Command as BaseCommand;

class MyCommand extends BaseCommand // implements \Symfony\Component\Console\Command\SignalableCommandInterface
{
    // Uncomment if not extending the BaseCommand class
    // use \Winter\Storm\Console\Traits\HandlesCleanup;
    
    // ...

    /**
     * Handle the cleanup of this command if a termination signal is received
     */
    public function handleCleanup(): void
    {
        $this->newLine();
        $workingPath = storage_path('tmp/my-working-file.json');
        $this->info('Cleaning up: ' . $workingPath);
        unlink($workingPath);
    }
}

Symfony 文档 了解更多信息。

处理记录

Winter提供Winter\Storm\Console\ProcessesQuery 用于必须处理来自数据库查询的大量记录的控制台命令的特征。下面提供了该特征的示例使用:

<?php namespace MyAuthor\MyPlugin\Console;

use Winter\Storm\Console\Command;
use MyAuthor\MyPlugin\Models\MyModel;

class ProcessRecords extends Command
{
    use \Winter\Storm\Console\Traits\ProcessesQuery;
    use \Winter\Storm\Console\Traits\ConfirmsWithInput;

    /**
     * @var string The console command name.
     */
    protected static $defaultName = 'myplugin:processrecords';

    /**
     * @var string The name and signature of this command.
     */
    protected $signature = 'myplugin:processrecords
        {--limit=0 : The maximum number of records to process. Defaults to all.}
        {--chunk=100 : The number of records to process at once.}
        {--f|force : Force the operation to run and ignore production warnings and confirmation questions.}
    ';

    /**
     * @var string The console command description.
     */
    protected $description = 'Processes the selected records';

    /**
     * Execute the console command.
     */
    public function handle(): int
    {
        // Build the query that will retrieve all the records to be processed
        $query = MyModel::query()->withTrashed();

        // Get the total number of records to be processed for the alert message
        $totalRecords = $query->count();

        // Ask the user to confirm the processing action by entering the number
        // of records to be affected
        if (!$this->confirmWithInput(
            sprintf(
                'This will process all selected records, a total of %s.',
                number_format($totalRecords)
            ),
            $totalRecords
        )) {
            return 1;
        }

        // Process the records
        $this->processQuery(
            $query,
            function ($record) {
                $record->myCustomAction();
            },
            $this->option('chunk'),
            $this->option('limit')
        );

        return 0;
    }
}

写输出

Laravel 文档 了解如何将输出发送到控制台。

可用的输出方式:

Alerts

alert($message) 方法可以很容易地用提供的消息呈现一个“警告框”,以引起对重要通知的更多关注。

此方法也由 Laravel 提供(目前未记录),但是 Winter 的实现还包括支持自动将警告框大小包装为标准的 80 个字符宽度,以防止长消息破坏警告框的格式。

$this->alert('This will remove the database tables and files for the "Winter.Builder" plugin.');

会输出

*************************************************************
*  This will remove the database tables and files for the   *
*                 "Winter.Builder" plugin.                  *
*************************************************************

注册命令

注册控制台命令

命令类完成后,您需要注册它以便可以使用。这通常是在register 一个方法插件注册文件 使用registerConsoleCommand 辅助方法。

class MyPlugin extends PluginBase
{
    public function register()
    {
        $this->registerConsoleCommand('myauthor.mycommand', \MyAuthor\MyPlugin\Console\MyCommand::class);
    }
}

或者,插件可以提供一个名为init.php 在可用于放置命令注册逻辑的插件目录中。在此文件中,您可以使用Artisan::add 注册命令的方法:

Artisan::add(new MyAuthor\MyPlugin\Console\MyCommand);

在应用程序容器中注册命令

如果您的命令在应用容器, 你可以使用Artisan::resolve 使 Artisan 可用的方法:

Artisan::resolve('myauthor.mycommand');

在服务提供者中注册命令

如果您需要从一个服务提供者,你应该调用commands 提供者的方法boot 方法,通过container 绑定命令:

public function boot()
{
    $this->app->singleton('myauthor.mycommand', function() {
        return new \MyAuthor\MyCommand\Console\MyCommand;
    });

    $this->commands('myauthor.mycommand');
}

调用其他命令

Laravel 文档 了解如何以编程方式调用命令。

豫ICP备18041297号-2