## **简介**
不管是 Node.js、Python 还是 PHP 的 Web 框架,都提供了通过命令行与应用进行交互的功能,通过这些命令行工具,我们可以完成一些初始化操作,比如创建新应用、执行数据库迁移、或者快速创建类文件等,在 Laravel 中,我们可以通过三种工具实现命令行交互:
* Artisan:Laravel 内置的命令行操作工具集,支持自定义命令;
* Tinker:一个由[PsySH](https://github.com/bobthecow/psysh)扩展包驱动的 REPL,允许你通过命令行与整个 Laravel 应用进行交互;
* Laravel 安装器,这个我们在[搭建适用于Mac的轻量级开发环境Valet]([https://www.kancloud.cn/sdwang/learning\_laravel/1279573](https://www.kancloud.cn/sdwang/learning_laravel/1279573))已经提到过,比较简单,不再赘述。
## **Artisan命令**
我们在前面的学习中已经多次使用过Artisan命令,比如创建控制器:
~~~
php artisan make:controller PostController
~~~
如果你查看应用根目录,会看到一个`artisan`文件,这个就是命令行交互的入口文件,就像`public/index.php`是 Web 请求的入口文件一样。在`artisan`文件中,处理流程会像Web请求一样:注册类的自动加载器、初始化容器和异常处理器、获取用户输入(`artisan`之后的部分都是请求参数)、执行处理逻辑、最后发送响应(只不过这一切都是在控制台中完成)。
> 注:Artisan 底层基于[Symfony Console 组件](https://symfony.com/doc/current/components/console.html),所以,如果你之前使写过 Symfony Console 命令,会很快熟悉 Artisan 命令的使用。
不同的 Laravel 应用由于安装了不同的扩展包或编写了自定义的 Artisan 命令,你可以通过`php artisan list`快速浏览该应用支持的所有命令。
### **内置Artisan命令**
Laravel应用默认提供了很多(内置)Artisan命令,现在我们挑几个最基本的命令来看下:
* `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
在运行Artisan命令时可以传入以下选项参数:
* `-q`:禁止所有输出
* `-v`、`-vv`、`-vvv`:命令执行输出的三个级别,分别代表正常、详细、调试
* `--no-interaction`:不会问任何交互问题,所以适用于运行无人值守自动处理命令
* `--env`:允许你指定命令运行的环境
* `--version`:打印当前 Laravel 版本
### **编写第一个Artisan命令**
在实际项目开发中我们经常需要编写自定义的Artisan命令,比如数据迁移、数据修复、定时任务等。
首先,我们要了解专门有一个系统自带命令`make:command`来创建自定义命令文件:
~~~
php artisan make:command WelcomeMessage --command=welcome:message
~~~
该命令的第一个参数就是要创建的 Artisan 命令类名,还可以传递一个选项参数`--command`用于自定义该命令的名称(不指定的话会系统会根据类名自动生成)。执行完该命令后,会在`app/Console/Commands`目录下创建一个`WelcomeMessage.php`文件:
~~~
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
class WelcomeMessage extends Command
{
/**
* 命令名称,在控制台执行命令时用到
*
* @var string
*/
protected $signature = 'welcome:message';
/**
* 命令描述
*
* @var string
*/
protected $description = 'print welcome message';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* 命令具体执行逻辑放在这里
*
* @return mixed
*/
public function handle()
{
//我们先简单打印一条欢迎信息
$this->info('欢迎访问 Laravel 学院!');
}
}
~~~
然后,创建完 Artisan 命令类后,还需要在`app/Console/Kernel.php`中注册才能使用,就像编写好控制器方法后,需要在路由文件中定义路由指向它一样。
打开`app/Console/Kernel.php`,将新创建的命令类`WelcomeMessage`添加到`$commands`完成注册:
~~~
protected $commands = [
App\Console\Commands\WelcomeMessage::class
];
~~~
现在,运行`php artisan list`就可以看到`welcome:message`命令了。最后,在应用根目录下运行`php artisan welcome:message`的话就可以打印上面那条欢迎信息了。
### **基于闭包实现Artisan命令**
当然,就像我们可以在`routes/web.php`中基于闭包实现简单业务逻辑一样,对于这么简单的命令,我们也可以在`routes/console.php`中基于闭包实现:
~~~
Artisan::command('welcome:message_simple', function () {
$this->info('欢迎访问 Laravel 学院!');
})->describe('打印欢迎信息');
~~~
这样我们就可以在命令行运行`php artisan welcome:message_simple`打印欢迎信息了,效果和上面通过命令类实现的一样。
## **通过Tinker实现Laravel命令行交互式Shell**
Laravel Tinker是基于[PsySH](https://github.com/bobthecow/psysh)(通过`composer g require psy/psysh:@stable`全局安装)——相较于原生的`php -a`,PsySH拥有更多高级特性,比如编写各种代码、打印语句、计算表达式、编写函数等等——实现的,与主要用于编写和执行Artisan命令不同,通过Tinker我们可以在命令行中实现与Laravel应用的各种交互,包括数据库的增删改查。
### **Laravel Tinker使用**
在命令行中通过`php artisan tinker`即可进入 Laravel Tinker 的交互式 Shell。每次我们运行`php artisan tinker`就相当于从控制台启动了 Laravel 应用,在运行交互式命令前,`tinker`命令会添加一些命令到Shell,这些命令定义在`Laravel\Tinker\Console\TinkerCommand`的`$commandWhitelist`属性中:
~~~
protected $commandWhitelist = [
'clear-compiled', 'down', 'env', 'inspire', 'migrate', 'optimize', 'up',
];
~~~
因此,你可以在 Tinker Shell 中直接运行这些命令。
**Tinker最有用的功能,就是可以在Tinker Shell中演练测试 Laravel 代码**,比如模型和服务。你可以使用控制台来创建一个新的模型,将其保存到数据库,然后查询这条记录(如果之前没有运行过`php artisan migrate`命令创建`users`表,先运行`migrate`命令创建):
![](https://img.kancloud.cn/43/e7/43e737196c8fa7833d614f80e2e344d1_1470x930.png)
这里,我们只是介绍了一些入门级的使用示例,更多好玩的东西有赖于你自己在日常开发中去探索,PsySH[官方文档](http://psysh.org/)有很多资源让你了解 Tinker 的底层,如果你想了解更多关于 Tinker 的内容,可以去 Tinker 的[GitHub 仓库](https://github.com/laravel/tinker)逛逛。