Laravel命令Artisan介绍和使用

xiaohai 2019-05-26 09:14:36 3029人围观 标签: PHP  Laravel 
简介不管是 Node.js、Python 还是 PHP 的 Web 框架,都提供了通过命令行与应用进行交互的功能,通过这些命令行工具,我们可以完成一些初始化操作,比如创建新应用、执行数据库迁移、或者快速创建类文件等,在 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() 方法,本质上都是调用了一个方法,所以参数都是一样的。