Laravel 的 Artisan 命令行工具
简介
Artisan 是 Laravel 自带的命令行接口,它提供了许多实用的命令来帮助你构建 Laravel 应用。要查看所有可用的 Artisan 命令的列表,可以使用 list
命令:
php artisan list
每个命令包含了「帮助」界面,它会显示并概述命令的可用参数及选项。只需要在命令前面加上 help
即可查看命令帮助界面:
php artisan help migrate
Laravel REPL
所有 Laravel 应用都包含了 Tinker,一个基于 PsySH 包提供支持的 REPL。 Tinker
让你可以在命令行中与你整个的 Laravel 应用进行交互,包括 Eloquent ORM、任务、事件等等。运行 Artisan 命令 tinker
进入 Tinker 环境:
php artisan tinker
编写命令
除 Artisan 提供的命令之外,还可以构建自己的自定义命令。命令默认存储在 app/Console/Commands
目录,你也可以修改 composer.json
文件来指定你想要存放的目录。
生成命令
要创建一个新的命令,可以使用 Artisan 命令 make:command
。这个命令会在 app/Console/Commands
目录中创建一个新的命令类。 不必担心应用中不存在这个目录,因为它会在你第一次运行 Artisan 命令 make:command
时创建。生成的命令会包括所有命令中默认存在的属性和方法:
php artisan make:command SendEmails
命令结构
命令生成后,应先填写类的 signature
和 description
属性,这会在使用 list
命令的时候显示出来。执行命令时会调用 handle
方法,你可以在这个方法中放置命令逻辑。
为了更好的代码复用,最好保持你的控制台代码轻量并让它们延迟到应用服务中完成。在下面的例子中,请注意,我们注入了一个服务类来完成发送邮件的「重任」。
让我们看一个简单的例子。注意,我们可以在 Command 的构造函数中注入我们需要的任何依赖项。Laravel 服务容器 将会自动注入所有在构造函数中的带类型约束的依赖:
<?php
namespace App\Console\Commands;
use App\User;
use App\DripEmailer;
use Illuminate\Console\Command;
class SendEmails extends Command
{
/**
* 控制台命令 signature 的名称。
*
* @var string
*/
protected $signature = 'email:send {user}';
/**
* 控制台命令说明。
*
* @var string
*/
protected $description = 'Send drip e-mails to a user';
/**
* 邮件服务的 drip 属性。
*
* @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')));
}
}
闭包命令
基于闭包的命令提供一个用类替代定义控制台命令的方法。同样的,路由闭包是控制器的一种替代方法,而命令闭包可以视为命令类的替代方法。在 app/Console/Kernel.php
文件的 commands
方法中, Laravel 加载了 routes/console.php
文件:
/**
* 注册应用的基于闭包的命令。
*
* @return void
*/
protected function commands()
{
require base_path('routes/console.php');
}
虽然这个文件没有定义 HTTP 路由,它也将基于控制台的入口点(路由)定义到应用中。在这个文件中,你可以使用 Artisan::command
方法定义所有基于闭包的路由。command
方法接收两个参数:命令签名 和一个接收命令参数和选项的闭包:
Artisan::command('build {project}', function ($project) {
$this->info("Building {$project}!");
});
闭包绑定底层的命令实例,因此你可以完全访问通常可以在完整命令类中访问的所有辅助方法。
类型提示依赖
除了接收命令的参数和选项外,命令闭包也可以使用类型提示 从 服务容器 中解析你想要的其他依赖关系:
use App\User;
use App\DripEmailer;
Artisan::command('email:send {user}', function (DripEmailer $drip, $user) {
$drip->send(User::find($user));
});
闭包命令描述
当定义一个基于闭包的命令时,你可以使用 describe
方法来为命令添加描述。这个描述会在你执行 php artisan list
或 php artisan help
命令时显示:
Artisan::command('build {project}', function ($project) {
$this->info("Building {$project}!");
})->describe('Build the project');
定义输入期望
在编写控制台命令时,通常是通过参数和选项来收集用户输入。Laravel 可以非常方便地在你的命令里用 signature
属性来定义你期望用户输入的内容。signature
属性允许你使用单一且可读性非常高的、类似路由的语法定义命令的名称、参数和选项。
参数
所有用户提供的参数及选项都被包含在花括号中。在下面的例子中,这个命令定义了一个 必须 的参数 user
:
/**
* 控制台命令 signature 的名称。
*
* @var string
*/
protected $signature = 'email:send {user}';
你也可以创建可选参数,并定义参数的默认值:
// 可选参数...
email:send {user?}
// 带有默认值的可选参数...
email:send {user=foo}