除了 Artisan 本身提供的命令之外,您也可以建立与您的应用程序相关的命令,这些自建命令将会存放在 app/commands
目录底下;然而,您可以任意选择存放位置,只要您的命令能够被 composer.json 自动载入。
要创建一个新的命令,您可以使用 command:make 这个 Artisan 命令,这将产生一个命令基本文件协助您开始编码:
php artisan command:make FooCommand
默认情况下,生成的命令将被储存在 app/commands
目录;然而,您可以指定自定义路径或命名空间:
php artisan command:make FooCommand --path=app/classes --namespace=Classes
在创建命令时,加上 --command
这个选项,将可以指定这个命令的名称:
php artisan command:make AssignUsers --command=users:assign
当自定义命令生成后,您需再填写命令的 名称
与 描述
,这部份将会显示在命令行表清单的画面上。
当您的自定义命令被执行时,将会调用 fire
方法,您可以在此加入任何的逻辑判断。
getArguments
与 getOptions
方法是用来接收要传入您的自定义命令的地方,这两个方法都会回传一组命令数组,并由数组清单所组成。
当定义 arguments
时,该数组对应的值表示如下:
array($name, $mode, $description, $defaultValue)
参数 mode
可以是下列其中一项: InputArgument::REQUIRED
或 InputArgument::OPTIONAL
.
当定义 options
时,该数组对应的值表示如下:
array($name, $shortcut, $mode, $description, $defaultValue)
对选项而言, 参数 mode
可以是下列其中一项: InputOption::VALUE_REQUIRED
, InputOption::VALUE_OPTIONAL
, InputOption::VALUE_IS_ARRAY
, InputOption::VALUE_NONE
.
该 VALUE_IS_ARRAY
模式表示调用命令时可以传入多个值:
php artisan foo --option=bar --option=baz
该 VALUE_NONE
模式表示将选项当作是"开关"
php artisan foo --option
当您的命令执行时,您需要让您的应用程序可以获取到这些参数和选项的值, 要做到这一点,您可以使用 argument
和 option
方法:
$value = $this->argument('name');
$arguments = $this->argument();
$value = $this->option('name');
$options = $this->option();
显示信息到终端上,您可以使用 info
, comment
, question
和error
方法,每一种方法将会对应到一个 ANSI 颜色。
$this->info('Display this on the screen');
$this->error('Something went wrong!');
您也可以使用 ask
和 confirm
方法来提示用户进行输入:
$name = $this->ask('What is your name?');
$password = $this->secret('What is the password?');
if ($this->confirm('Do you wish to continue? [yes|no]'))
{
//
}
您也可以指定一个默认值给 confirm
方法,可以是 true
或 false
:
$this->confirm($question, true);
当您的自定义命令完成后,您需要向 Artisan 注册才能使用,通常是在 app/start/artisan.php
,在此文件内,您可以使用 Artisan::add
方法注册该命令:
Artisan::add(new CustomCommand);
如果您的自定义命令是在应用程序 IoC container 内注册,您需要使用 Artisan::resolve
方法让 Artisan 可以使用:
Artisan::resolve('binding.name');
如果您需要从 service provider 注册命令,您应该在 provider 的 boot
方法内调用 commands
方法,传入 IoC container 绑定此命令:
public function boot()
{
$this->commands('command.binding');
}
有时候您可能希望在您的命令内部调用其它命令,此时您可以使用 call
方法:
$this->call('command:name', array('argument' => 'foo', '--option' => 'bar'));