🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
## **简介** 不管是 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)逛逛。