在Laravel 5.1 中创建自定义 Artisan 控制台命令实例
1、入门
Laravel通过Artisan提供了强大的控制台命令来处理非浏览器业务逻辑。要查看Laravel中所有的Artisan命令,可以通过在项目根目录运行:
php artisan
对应输出如下(部分截图):
其中一些命名我们已经比较熟悉了,比如创建迁移make:migration以及执行迁移migrate,又比如创建模型make:model,创建控制器make:controller等。
如果要查看具体某个命令的使用方法,比如我们要查看创建Artisan命令make:console的具体用法,可以使用如下命令:
php artisan help make:console
对应输出如下:
2、创建命令
Artisan除了提供丰富的控制台命令之外,还允许我们通过make:console命令创建自己的控制台命令。上面我们已经使用help指令查看了make:console的用法,下面我们就沿着这条路走下去,一探究竟:创建命令并运行起来得到我们想要的各种结果。
首先我们创建一个最简单的命令,打印Hello LaravelAcademy,使用Artisan命令如下:
php artisan make:console HelloLaravelAcademy –command=laravel:academy
其中HelloLaravelAcademy是命令名,laravel:academy是控制台执行的命令,类似make:console。
执行完成后,会在app/Console/Commands目录下生成一个HelloLaravelAcademy.php文件:
如果无参调用argument方法,则返回的是所有参数值数组。
获取选项值可以通过IlluminateConsoleCommand的option方法:
$mark = $this->option(‘mark’);
同理,无参调用option方法会返回所有选项值数组。
这样我们可以修改HelloLaravelAcademy的handle方法如下:
public function handle()
{
$name = $this->argument(‘name’);
$mark = $this->option(‘mark’);
$string = ‘Hello ‘.$name;
if($mark)
$string .= $mark;
echo $string.”n”;
}
这样我们在控制台输入如下Artisan命令:
php artisan laravel:academy
对应输出为:
Hello LaravelAcademy!
再运行如下Artisan命令:
php artisan laravel:academy Laravel –mark=?
对应输出为:
Hello Laravel?
输入提示
我们甚至还可以完全让用户通过在控制台输入name来获取输入参数,首先修改handle方法如下:
public function handle()
{
$name = $this->ask(‘What do you want to say Hello?’);
echo “Hello “.$name.”n”;
}
然后在终端输入php artisan laravel:academy,交互页面如下:
如果是输入密码一类的敏感信息可以用secret替代ask方法。
有时候我们会根据用户的意愿选择继续还是中止:
public function handle()
{
if($this->confirm(‘Do you want to continue?[y|n]’)){
$this->info(“Continue”);
}else{
$this->error(“Interrupt”);
}
}
对应输出为:
除了让用户手动输入外,还可以使用anticipate方法实现自动完成功能:
public function handle()
{
$name = $this->anticipate(‘What is your name?’, [‘Laravel’, ‘Academy’]);
$this->info($name);
}
当然还可以使用choice方法为用户提供选择避免手动输入,用户只需选择对应索引即可:
public function handle()
{
$name = $this->choice(‘What is your name?’, [‘Laravel’, ‘Academy’]);
$this->info($name);
}
对应交互页面如下:
编写输出
关于输出字符串,上面我们简单使用了echo语句,其实Laravel提供了更为强大和多样化的方法:
public function handle()
{
$this->info(“Successful!”);
$this->error(“Something Error!”);
$this->question(“What do you want to do?”);
$this->comment(“Just Comment it!”);
}
执行php artisan laravel:academy对应输出如下:
表格
Artisan甚至可以输出表格:
public function handle()
{
$headers = [‘Name’, ‘Email’];
$users = AppUser::all([‘name’, ’email’])->toArray();
$this->table($headers, $users);
}
执行php artisan laravel:academy对应输出为:
进度条
当然对于复杂耗时的命令,进度条是必不可少的,
public function handle()
{
$this->output->progressStart(10);
for ($i = 0; $i < 10; $i++) { sleep(1); $this->output->progressAdvance();
}
$this->output->progressFinish();
}
执行php artisan laravel:academy对应输出为:
5、从CLI之外调用Artisan
除了在控制台执行Artisan命令之外,还可以通过代码在别处调用Artisan命令,比如其它Artisan命令、控制器、路由或其他。
路由
在路由闭包中我们可以通过Artisan门面的call方法来调用本节创建的命令:
//在路由中调用Artisan命令
Route::get(‘testArtisan’,function(){
$exitCode = Artisan::call(‘laravel:academy’, [
‘name’ => ‘Laravel学院’, ‘–mark’ => ‘!’
]);
});
其它Artisan命令
在一个Artisan命令中也可以调用另一个Artisan命令,还是通过call方法:
public function handle()
{
$this->call(‘inspire’);
}
如果想要调用一个Artisan命令并阻止其所有输出,可以使用callSilent方法:
public function handle()
{
$this->callSilent(‘inspire’);
}