Artisan 控制台
介绍
Artisan 是 Laravel 附带的命令行界面的名称。它提供了许多有用的命令供您在开发应用程序时使用。它由强大的 Symfony Console 组件驱动。要查看所有可用的 Artisan 命令列表,您可以使用 list
命令:
php artisan list
每个命令还包括一个“帮助”屏幕,显示并描述命令的可用参数和选项。要查看帮助屏幕,只需在命令名称前加上 help
:
php artisan help migrate
编写命令
除了 Artisan 提供的命令外,您还可以为您的应用程序构建自己的自定义命令。您可以将自定义命令存储在 app/Console/Commands
目录中;不过,只要您的命令可以根据 composer.json
设置自动加载,您可以自由选择自己的存储位置。
要创建新命令,您可以使用 make:console
Artisan 命令,它将生成一个命令模板以帮助您入门:
php artisan make:console SendEmails
上面的命令将在 app/Console/Commands/SendEmails.php
生成一个类。在创建命令时,可以使用 --command
选项分配终端命令名称:
php artisan make:console SendEmails --command=emails:send
命令结构
生成命令后,您应填写类的 signature
和 description
属性,这些属性将在 list
屏幕上显示您的命令时使用。
当执行命令时,将调用 handle
方法。您可以在此方法中放置任何命令逻辑。让我们看一个示例命令。
请注意,我们可以将任何需要的依赖项注入到命令的构造函数中。Laravel 服务容器 将自动注入构造函数中类型提示的所有依赖项。为了更大的代码重用性,最好保持控制台命令轻量,并让它们委托给应用程序服务来完成任务。
<?php
namespace App\Console\Commands;
use App\User;
use App\DripEmailer;
use Illuminate\Console\Command;
class SendEmails extends Command
{
/**
* 控制台命令的名称和签名。
*
* @var string
*/
protected $signature = 'email:send {user}';
/**
* 控制台命令描述。
*
* @var string
*/
protected $description = '向用户发送滴灌电子邮件';
/**
* 滴灌电子邮件服务。
*
* @var DripEmailer
*/
protected $drip;
/**
* 创建新的命令实例。
*
* @param DripEmailer $drip
* @return void
*/
public function __construct(DripEmailer $drip)
{
parent::__construct();
$this->drip = $drip;
}
/**
* 执行控制台命令。
*
* @return mixed
*/
public function handle()
{
$this->drip->send(User::find($this->argument('user')));
}
}
命令 I/O
定义输入期望
编写控制台命令时,通常需要通过参数或选项从用户那里收集输入。Laravel 使定义用户期望的输入变得非常方便,您可以在命令上使用 signature
属性。signature
属性允许您以一种简单、类似路由的语法定义命令的名称、参数和选项。
所有用户提供的参数和选项都用大括号括起来。在以下示例中,命令定义了一个必需参数:user
:
/**
* 控制台命令的名称和签名。
*
* @var string
*/
protected $signature = 'email:send {user}';
您还可以使参数可选并为可选参数定义默认值:
// 可选参数...
email:send {user?}
// 带默认值的可选参数...
email:send {user=foo}
选项与参数一样,也是用户输入的一种形式。然而,它们在命令行中指定时以两个连字符(--
)为前缀。我们可以在签名中这样定义选项:
/**
* 控制台命令的名称和签名。
*
* @var string
*/
protected $signature = 'email:send {user} {--queue}';
在此示例中,可以在调用 Artisan 命令时指定 --queue
开关。如果传递了 --queue
开关,选项的值将为 true
。否则,值将为 false
:
php artisan email:send 1 --queue
您还可以通过在选项名称后加上 =
符号来指定选项应由用户分配一个值,表示应提供一个值:
/**
* 控制台命令的名称和签名。
*
* @var string
*/
protected $signature = 'email:send {user} {--queue=}';
在此示例中,用户可以这样传递选项的值:
php artisan email:send 1 --queue=default
您还可以为选项分配默认值:
email:send {user} {--queue=default}
要在定义选项时分配快捷方式,您可以在选项名称之前指定它,并使用 | 分隔符将快捷方式与完整选项名称分开:
email:send {user} {--Q|queue}
输入描述
您可以通过使用冒号将参数与描述分开来为输入参数和选项分配描述:
/**
* 控制台命令的名称和签名。
*
* @var string
*/
protected $signature = 'email:send
{user : 用户的 ID}
{--queue= : 是否应将作业排队}';
检索输入
在执行命令时,您显然需要访问命令接受的参数和选项的值。为此,您可以使用 argument
和 option
方法:
要检索参数的值,请使用 argument
方法:
/**
* 执行控制台命令。
*
* @return mixed
*/
public function handle()
{
$userId = $this->argument('user');
//
}
如果需要将所有参数作为 array
检索,请调用不带参数的 argument
:
$arguments = $this->argument();
选项可以像参数一样轻松检索,使用 option
方法。与 argument
方法一样,您可以调用不带任何参数的 option
以将所有选项作为 array
检索:
// 检索特定选项...
$queueName = $this->option('queue');
// 检索所有选项...
$options = $this->option();
如果参数或选项不存在,将返回 null
。
提示输入
除了显示输出,您还可以在命令执行期间要求用户提供输入。ask
方法将提示用户给定的问题,接受他们的输入,然后将用户的输入返回给您的命令:
/**
* 执行控制台命令。
*
* @return mixed
*/
public function handle()
{
$name = $this->ask('What is your name?');
}
secret
方法类似于 ask
,但用户的输入在控制台中输入时对他们不可见。此方法在询问密码等敏感信息时很有用:
$password = $this->secret('What is the password?');
询问确认
如果您需要询问用户简单的确认,可以使用 confirm
方法。默认情况下,此方法将返回 false
。但是,如果用户在提示中输入 y
,该方法将返回 true
。
if ($this->confirm('Do you wish to continue? [y|N]')) {
//
}
给用户一个选择
anticipate
方法可用于为可能的选择提供自动完成。用户仍然可以选择任何答案,无论选择如何。
$name = $this->anticipate('What is your name?', ['Taylor', 'Dayle']);
如果您需要给用户一个预定义的选择集,可以使用 choice
方法。用户选择答案的索引,但答案的值将返回给您。您可以设置默认值以在未选择任何内容时返回:
$name = $this->choice('What is your name?', ['Taylor', 'Dayle'], false);
写入输出
要将输出发送到控制台,请使用 line
、info
、comment
、question
和 error
方法。每种方法都将使用适当的 ANSI 颜色来实现其目的。
要向用户显示信息消息,请使用 info
方法。通常,这将在控制台中显示为绿色文本:
/**
* 执行控制台命令。
*
* @return mixed
*/
public function handle()
{
$this->info('Display this on the screen');
}
要显示错误消息,请使用 error
方法。错误消息文本通常以红色显示:
$this->error('Something went wrong!');
如果要显示普通控制台输出,请使用 line
方法。line
方法不会接收任何独特