Laravel命令Artisan介绍和使用
当我们新建一个Laravel项目后,其项目根目录下就有一个artisan文件,并且是可以执行的。
zhj@DESKTOP-06Q5JL3 MINGW64 /e/php/laravel/blog
$ ll
total 222
drwxr-xr-x 1 zhj 197121 0 11月 3 2018 app/
-rwxr-xr-x 1 zhj 197121 1686 8月 11 2018 artisan*
drwxr-xr-x 1 zhj 197121 0 8月 11 2018 bootstrap/
-rw-r--r-- 1 zhj 197121 1513 9月 4 2018 composer.json
-rw-r--r-- 1 zhj 197121 184478 9月 4 2018 composer.lock
drwxr-xr-x 1 zhj 197121 0 9月 4 2018 config/
drwxr-xr-x 1 zhj 197121 0 8月 11 2018 database/
-rw-r--r-- 1 zhj 197121 1022 8月 11 2018 package.json
-rw-r--r-- 1 zhj 197121 1134 8月 11 2018 phpunit.xml
drwxr-xr-x 1 zhj 197121 0 9月 6 2018 public/
drwxr-xr-x 1 zhj 197121 0 8月 11 2018 resources/
drwxr-xr-x 1 zhj 197121 0 9月 4 2018 routes/
-rw-r--r-- 1 zhj 197121 563 8月 11 2018 server.php
drwxr-xr-x 1 zhj 197121 0 9月 4 2018 storage/
drwxr-xr-x 1 zhj 197121 0 8月 11 2018 tests/
drwxr-xr-x 1 zhj 197121 0 9月 4 2018 vendor/
-rw-r--r-- 1 zhj 197121 549 8月 11 2018 webpack.mix.js
-rw-r--r-- 1 zhj 197121 0 8月 11 2018 yarn-error.log
所以我们可以在项目中使用artisan命令来执行很多操作。
一、Laravel自带的命令
可以使用 php artisan list 来查看所有的内置命令。这里的命令比较多,所以不再这里进行说明了。
1、运行 Artisan 命令时可以传入的选项参数:
- -q:禁止所有输出
- -v、-vv、-vvv:命令执行输出的三个级别,分别代表正常、详细、调试
- –no-interaction:不会问任何交互问题,所以适用于运行无人值守自动处理命令
- –env:允许你指定命令运行的环境
- –version:打印当前 Laravel 版本
使用示例:
$ php artisan -V
Laravel Framework 5.6.33
2、常见的命令
- help:为指定命令提供使用帮助信息,如 php artisan help make:request
- clear-compiled:移除编译过的类文件,比如缓存、Blade视图文件等
- down:将应用切换到维护模式以便查找问题
- up:将应用从维护模式恢复为正常模式
- env:显示应用当前运行环境,如 local、production
- migrate:运行所有数据库迁移
- optimize:优化应用以便提供更好的性能
- serve:在本地 localhost:8000 端口启动 PHP 内置服务器
- tinker:进入 Tinker REPL
- dump-server:启动 dump server 收集 dump 信息
- preset:切换应用前端框架脚手架代码,比如从 Vue 切换到 React
使用示例:
$ php artisan help make:request
Description:
Create a new form request class
Usage:
make:request <name>
Arguments:
name The name of the class
Options:
-h, --help Display this help message
-q, --quiet Do not output any message
-V, --version Display this application version
--ansi Force ANSI output
--no-ansi Disable ANSI output
-n, --no-interaction Do not ask any interactive question
--env[=ENV] The environment the command should run under
-v|vv|vvv, --verbose Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
3、分组命令
- app:只包含 app:name 命令,用于替换应用默认命名空间 App\
- auth:只包含 auth:clear-resets,用于从数据库清除已过期的密码 Token
- cache:应用缓存相关命令
- config:config:cache 用于缓存应用配置,config:clear 用于清除缓存配置
- db:db:seed 用于通过填充器填充数据库(如果编写了填充器的话)
- event:event:generate 用于根据注册信息生成未创建的事件类及监听器类
- key:key:generate 用于手动设置应用的 APP_KEY
- make:用于根据模板快速生成应用各种脚手架代码,如认证、模型、控制器、数据库迁移文件等等等,我们会将每个命令穿插在相应教程中介绍
- migrate:数据库迁移相关命令(数据库教程中会详细介绍)
- notifications:notifications:table 用于生成通知表
- optimize:optimize:clear 用于清除缓存的启动文件
- package:package:discover 用于重新构建缓存的扩展包 manifest
- queue:队列相关命令(队列教程中会详细介绍)
- route:路由相关命令,route:cache 和 route:clear 分别用于缓存路由信息和清除路由缓存,route:list 用于列出应用所有路由信息
- schedule:调度任务相关命令(调度任务教程中会介绍)
- session:对于数据库驱动的 Session,我们通过 session:table 生成 sessions 数据表
- storage:storage:link 生成一个软链 public/storage 指向 storage/app/public
- vendor:vendor:publish 用于发布扩展包中的公共资源
- view:view:cache 用于编译应用所有 Blade 模板,view:clear 用于清除这些编译文件
常见命令的使用可以参考:Laravel 5.1 LTS 速查表
二、自定义Artisan命令
1、创建命令类
$ php artisan make:command ShowInfo --command=show:info
Console command created successfully.
创建成功后,会在app/Console/Commands下创建一个ShowInfo.php文件。该命令的第一个参数就是要创建的 Artisan 命令类名,还可以传递一个选项参数 --command 用于自定义该命令的名称,不指定的话会系统会根据类名自动生成。
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
class ShowInfo extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'show:info';
/**
* The console command description.
*
* @var string
*/
protected $description = 'show info';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
* @return mixed
*/
public function handle()
{
//
}
}
2、注册命令
app/Console/Kernel.php 中注册才能使用,所以需要在该文件中添加如下信息:
protected $commands = [ \App\Console\Commands\ShowInfo::class, ];
这里就注册完成了,现在可以通过php artisan list查看我们添加的命令了。如:
... session session:table Create a migration for the session database table show show:info show info storage storage:link Create a symbolic link from "public/storage" to "storage/app/public" ...
3、在ShowInfo.php命令文件中添加信息
public function handle()
{
//
$this->info("Hello Laravel");
}
然后执行命令:
$ php artisan show:info
Hello Laravel
到这里就算完成了一个基本的命令。
4、基于闭包实现 Artisan 命令
通过这种方式实现命令,需要在routes/console.php中去实现,如:
Artisan::command('show:version', function () {
$this->info(app()->version());
})->describe('show Laravel version');
通过php artisan list可以查看
... session session:table Create a migration for the session database table show show:info show info show:version show Laravel version storage storage:link Create a symbolic link from "public/storage" to "storage/app/public" ...
执行命令:
$ php artisan show:version
5.6.33
三、Artisan命令
1、定义参数
1.1、要定义一个必填参数,需要用花括号将其包裹起来
show:info {name}
1.2、要定义一个可选参数,可以在参数名称后面加一个问号
show:info {name?}
1.3、要为可选参数定义默认值
show:info {name=Laravel}
示例:
protected $signature = 'show:info {param_1:param_1 description} {param_2:param_2 description?} {param_3:param_3 description=Laravel}';
显示命令帮助:
$ php artisan help show:info
Description:
show info
Usage:
show:info <param_1:param_1 description> [<param_2:param_2 description> [<param_3:param_3 description>]]
Arguments:
param_1:param_1 description
param_2:param_2 description
param_3:param_3 description [default: "Laravel"]
可以看出参数1必传,参数2选填,参数3有默认值
2、定义选项
选项和参数很像,但是选项有前缀 --,而且可以在没有值的情况下使用。
2.1、添加一个最基本的选项,可以通过花括号将其包裹
show:info {--option}
2.2、选项必须要设置选项值,可以加上一个 =
show:info {--option=}
2.3、设置默认选项值
show:info {--option=value}
2.4、缩写,比如我们可以通过 O 来代表 option
show:info {--O|option}
示例:
protected $signature = 'show:info {--option_1} {--option_2=} {--option_3=value} {--O|option_4}';
显示命令帮助:
$ php artisan help show:info
Description:
show info
Usage:
show:info [options]
Options:
--option_1
--option_2[=OPTION_2]
--option_3[=OPTION_3] [default: "value"]
-O, --option_4
3、数组参数和数组选项
不管是参数还是选项,如果你想要接收数组作为参数,都要使用 * 通配符:
show:info {name*} {--option*}
注:数组参数必须是参数列表中的最后一个参数。
5、获取参数和选项的方法
5.1、获取参数
$this->argument()
5.2、获取选项
$this->option()
使用示例:
protected $signature = 'show:info {param} {--option=}';
public function handle()
{
$this->info("Hello Laravel:param=".$this->argument('param').' --option='.$this->option('option'));
}
运行命令:
$ php artisan show:info Laravel --option=5.6
Hello Laravel:param=Laravel --option=5.6
三、Artisan命令交互
3.1、提示输入文本
$username = $this->ask('请输入用户名:');
3.2、输入敏感信息
$password = $this->secret("请输入密码:");
3.3、确认信息
$confirm = $this->confirm("确认要执行下面的命令吗?");
3.4、提示功能(暂未测试成功)
$city = $this->anticipate('你来自哪个城市', [
"北京",
"杭州",
"深圳"
]);
3.5、提供选项让用户选择
$framework = $this->choice('框架名字?', ['Laravel', 'Academy']);
3.6、输出信息
$this->info("令执行成功后通过该方法以绿色文本输出提示信息");
$this->error("红色高亮文本输出错误信息");
$this->question("输出问题(靛蓝色高亮)");
$this->comment("注释信息(黄色)");
$this->line("输出行信息(没有颜色)");
3.7、表格
$headers = ['姓名', '城市'];
$data = [
['张三', '北京'],
['李四', '上海']
];
$this->table($headers, $data);
3.8、进度条
$totalUnits = 100;
$this->output->progressStart($totalUnits);
$i = 0;
while ($i++ < $totalUnits) {
usleep(100000);
$this->output->progressAdvance(1);
}
$this->output->progressFinish();
以上整体代码如下:
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
class ShowInfo extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'show:info';
/**
* The console command description.
*
* @var string
*/
protected $description = 'show info';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
* @return mixed
*/
public function handle()
{
$username = $this->ask('请输入用户名:');
$this->info("输入的用户名为:" . $username);
$password = $this->secret("请输入密码:");
$this->info("输入的密码为:" . $password);
$confirm = $this->confirm("确认要执行下面的命令吗?");
if ($confirm) {
$this->info('继续执行');
} else {
$this->info('不执行');
exit;
}
$framework = $this->choice('框架名字?', ['Laravel', 'Academy']);
$this->info($framework);
$this->info("令执行成功后通过该方法以绿色文本输出提示信息");
$this->error("红色高亮文本输出错误信息");
$this->question("输出问题(靛蓝色高亮)");
$this->comment("注释信息(黄色)");
$this->line("输出行信息(没有颜色)");
$headers = ['姓名', '城市'];
$data = [
['张三', '北京'],
['李四', '上海']
];
$this->table($headers, $data);
$totalUnits = 100;
$this->output->progressStart($totalUnits);
$i = 0;
while ($i++ < $totalUnits) {
usleep(100000);
$this->output->progressAdvance(1);
}
$this->output->progressFinish();
}
}
执行命令后效果如下:
E:\php\laravel\blog>php artisan show:info
请输入用户名::
> xiaohai
输入的用户名为:xiaohai
请输入密码::
>
输入的密码为:123456
确认要执行下面的命令吗? (yes/no) [no]:
> yes
继续执行
框架名字?:
[0] Laravel
[1] Academy
> 0
Laravel
令执行成功后通过该方法以绿色文本输出提示信息
红色高亮文本输出错误信息
输出问题(靛蓝色高亮)
注释信息(黄色)
输出行信息(没有颜色)
+------+------+
| 姓名 | 城市 |
+------+------+
| 张三 | 北京 |
| 李四 | 上海 |
+------+------+
100/100 [============================] 100%
四、应用代码中调用 Artisan 命令
除了在命令行运行 Artisan 命令之外,还可以在应用代码中通过 Artisan 门面调用它。你可以直接通过 Artisan:call() 调用指定命令,也可以通过 Artisan:queue() 将命令推送到队列中执行。
这两种方式都需要传递两个参数:第一个参数是命令名(比如 welcome:message),第二个参数是以数组形式传递的命令参数和选项。下面,我们简单演示在路由闭包中调用 Artisan 命令 show:info(带输入参数的):
Route::get('test_artisan', function () { $exitCode = Artisan::call('show:info', [ 'param' => 'Laravel', '--option' => '5.6' ]); });
正如你所看到的,参数和选项通过参数名和选项名作为键,如果选项没有值的话,以 true 或 false 替代。
你还可以在一个 Artisan 命令类中调用另一个 Artisan 命令,在命令类中调用 Artisan 命令,可以通过 Artisan:call(),也可以直接通过 $this->call() 方法,还可以通过 $this->callSilent() 方法(该方法会抑制所有输出),传递的参数格式完全一样。
最后,你还可以在任意类中注入实现了 Illuminate\Contracts\Console\Kernel 契约的实例,然后调用实例上的 call() 方法,本质上都是调用了一个方法,所以参数都是一样的。