Laravel 5.1 中创建自定义 Artisan 控制台命令实例教程 | 服务篇 | Laravel 5.1 基础教程


本站和网页 https://xueyuanjun.com/post/1374.html 的作者无关,不对其内容负责。快照谨为网络故障时之索引,不代表被搜索网站的即时页面。

Laravel 5.1 中创建自定义 Artisan 控制台命令实例教程 | 服务篇 | Laravel 5.1 基础教程
Laravel 学院
文档
Laravel 8.x 中文文档
Laravel 7.x 中文文档
Laravel 6.x 中文文档
Laravel 5.8 中文文档
Laravel 5.7 中文文档
Laravel 5.6 中文文档
Laravel 5.5 中文文档
Laravel 5.4 中文文档
Laravel 5.3 中文文档
Laravel 5.2 中文文档
Laravel 5.1 中文文档
Lumen 中文文档
全栈教程
PHP 全栈工程师指南
PHP 入门到实战
Laravel 入门到精通
Vue.js 入门到实战
玩转 PhpStorm 教程
Laravel 博客入门项目
Laravel 微信小程序项目
Laravel 前后端分离项目
Swoole 入门到实战
Eloquent 性能优化实战
Redis 高性能实战系列
Laravel 新版本特性
PHP 新特性与最佳实践
Golang
Go 入门教程
Go Web 编程
Gin 使用教程
微服务开发
内功修炼
数据结构与算法
网络协议
微服务从入门到实践
高性能 MySQL 实战
高性能 Redis 实战
Laravel 消息队列实战
Laravel 从学徒到工匠
PHP 设计模式系列
名企面试指南
资源库
Laravel 资源大全
Laravel 开源项目
Laravel 扩展包
Laravel 资源下载
更多
博客 & 新闻
问答 & 讨论
Leetcode 题解
学院君读书笔记系列
关于 Laravel 学院
Laravel 互助学习群
Golang 互助学习群
更多
Laravel 中文文档
Laravel 全栈教程
Laravel 学习路径
Go 入门教程
程序员内功修炼
博客
问答
搜索
注册
登录
Info
Content
章节导航
Laravel 5.1 基础教程
目录索引
安装篇
3篇文章
在 Windows 中安装 Laravel 5.1.X
在 Windows 上进行 Laravel Homestead 安装、配置及测试
在 Laravel Homestead 中使用 Blackfire Profiler 对应用性能进行分析
基础篇
8篇文章
HTTP路由实例教程(一)—— 基本使用及路由参数
HTTP路由实例教程(二)—— 路由命名和路由分组
HTTP路由实例教程(三)—— CSRF攻击原理及其防护
中间件实例教程 —— 中间件的创建使用及中间件参数定义
HTTP控制器实例教程 —— 创建RESTFul风格控制器实现文章增删改查
HTTP 请求实例教程 —— 获取请求数据、Cookie及文件上传处理
HTTP响应实例教程 —— 基本使用、生成Cookie、返回视图、JSON/JSONP、文件下载及重定向
Laravel 视图实例教程 —— 在视图间共享数据及视图Composer
底层篇
4篇文章
Laravel 5.x 启动过程分析
Laravel 服务容器实例教程 —— 深入理解控制反转和依赖注入
Laravel 服务提供者实例教程 —— 创建 Service Provider 测试实例
Laravel 门面实例教程 —— 创建自定义 Facades 类
数据库篇
12篇文章
Laravel 数据库实例教程 —— 使用DB门面操作数据库
Laravel 数据库实例教程 —— 使用查询构建器对数据库进行增删改查
Laravel 数据库实例教程 —— 使用查询构建器实现对数据库的高级查询
Eloquent ORM 实例教程 —— ORM概述、模型定义及基本查询
Eloquent ORM 实例教程 —— 模型创建、更新及批量赋值
Eloquent ORM 实例教程 —— 模型删除及软删除相关实现
Eloquent ORM 实例教程 —— 查询作用域和模型事件
Eloquent ORM 实例教程 —— 关联关系及其在模型中的定义(一)
Eloquent ORM 实例教程 —— 关联关系及其在模型中的定义(二)
在 Laravel 框架之外使用数据库查询构建器及 Eloquent ORM
将 Sequel Pro 中已存在的数据表导出为 Laravel 迁移文件
将 MySQL Workbench 中已存在的数据表导出到 Laravel 迁移文件
服务篇
29篇文章
Laravel Spark 牛刀初试 —— 安装、设置及使用
Laravel 实例教程 —— 如何在Laravel 5.1中进行自定义包开发
Laravel 5.1用户认证(一) —— 使用Laravel内置组件快速实现注册登录
Laravel 5.1用户认证(二) —— 使用Laravel内置组件快速实现密码重置
Laravel 5.1用户认证(三) —— 使用Socialite实现GitHub登录认证
Laravel 5.1 中的ACL用户授权及权限检查功能实现教程
Laravel 5.1 中创建自定义 Artisan 控制台命令实例教程
Laravel 支付解决方案之 Laravel Cashier (一)—— 安装配置篇
Laravel 支付解决方案之 Laravel Cashier (二)—— 付费会员&分期付款&生成发票
Laravel 支付解决方案之如何使用支付宝进行支付
Laravel 支付解决方案之如何使用银联支付进行支付
Laravel 支付解决方案之如何使用微信支付进行支付
Laravel 缓存实例教程(一) —— 基于Memcached缓存驱动的配置
Laravel 缓存实例教程(二) —— 基于模型+缓存对文章增删改查进行优化
Laravel中运行Gulp任务的利器 —— Laravel Elixir简介及入门教程
如何在 Laravel 5.1 中使用 Laravel Elixir 集成安装 Bootstrap
Laravel Elixir 深入探究(一):Elixir配置选项、前端资源文件编译及合并
Laravel Elixir 深入探究(二):版本控制、测试套件、任务执行以及自定义任务和扩展
Laravel 5.1中 Redis 的安装配置及基本使用教程
Laravel 5.1 分页功能实现及如何自定义分页样式
Laravel 5.1 中的异常处理器和HTTP异常处理实例教程
基于 Laravel 集成的 Monolog 库对日志进行配置和记录
Laravel 5.1 定义事件、事件监听器以及触发事件实例教程
使用 Laravel 5.1 的文件系统对文件进行存储、移动和删除操作
使用 Laravel 5.1 内置的本地化功能轻松实现多语言支持
在 Laravel 5.1 中使用SMTP驱动实现邮件发送(含附件和图片)详细教程
Laravel 队列系列 —— 基于 Redis 实现任务队列的基本配置和使用
Laravel 5.1 中 Session 数据存储、访问、删除及一次性Session实例教程
Laravel 5.1 测试系列 —— PHPUnit 安装及简单单元测试示例
实战篇
2篇文章
使用 Laravel 纯手工打造一个简单的电子商务网站(一) —— 后台新增商品及前台显示
使用 Laravel 纯手工打造一个简单的电子商务网站(二) —— 用户认证及购物车功能实现
图书
Laravel 5.1 基础教程
服务篇
Laravel 5.1 中创建自定义 Artisan 控制台命令实例教程
Laravel 5.1 中创建自定义 Artisan 控制台命令实例教程
由 学院君 创建于7年前, 最后更新于 2年前
版本号 #2
33874 views
13 likes
0 collects
1、入门
Laravel通过Artisan提供了强大的控制台命令来处理非浏览器业务逻辑。要查看Laravel中所有的Artisan命令,可以通过在项目根目录运行:
php artisan list
对应输出如下(部分截图):
其中一些命名我们已经比较熟悉了,比如创建迁移make:migration以及执行迁移migrate,又比如创建模型make:model,创建控制器make:controller等。
如果要查看具体某个命令的使用方法,比如我们要查看创建Artisan命令make:console的具体用法,可以使用如下命令:
php artisan help make:console
对应输出如下:
2、创建命令
Artisan除了提供丰富的控制台命令之外,还允许我们通过make:console命令创建自己的控制台命令。上面我们已经使用help指令查看了make:console的用法,下面我们就沿着这条路走下去,一探究竟:创建命令并运行起来得到我们想要的各种结果。
首先我们创建一个最简单的命令,打印Hello LaravelAcademy,使用Artisan命令如下:
php artisan make:console HelloLaravelAcademy --command=laravel:academy
其中HelloLaravelAcademy是命令名,laravel:academy是控制台执行的命令,类似make:console。
执行完成后,会在app/Console/Commands目录下生成一个HelloLaravelAcademy.php文件:
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
class HelloLaravelAcademy extends Command
/**
* The name and signature of the console command.
* @var string
*/
protected $signature = 'laravel:academy';
/**
* The console command description.
* @var string
*/
protected $description = 'Command description.';
/**
* Create a new command instance.
* @return void
*/
public function __construct()
parent::__construct();
/**
* Execute the console command.
* @return mixed
*/
public function handle()
//
其中$signature即为在控制台执行的命令名,$description为命令描述,handle方法为执行命令时调用的方法。
接下来我们简单编写handle方法如下:
public function handle()
echo "Hello LaravelAcademy\n";
好了,一个最简单的命令已经编写好了,接下来要怎么执行并在控制台打印出“Hello LaravelAcademy”呢?
3、运行命令
在运行命令前需要将其注册到App\Console\Kernel的$commands属性中:
protected $commands = [
... //其他命令类
\App\Console\Commands\HelloLaravelAcademy::class
];
接下来我们就可以在控制台运行如下Artisan命令:
php artisan laravel:academy
终端就会打印出:
Hello LaravelAcademy
是不是很简单?
4、更多样的输入输出
当然,上面是最简单的情形,没有输入,写死的输出。实际环境中有更复杂的需求,有更多样的输入输出,下面我们来一一讨论。
定义输入
上面已经提到,我们可以通过修改$signature属性定义输入参数及选项,比如这里我们将上述Hello后面的字符串调整为通过输入参数来控制,可修改$signature如下:
protected $signature = 'laravel:academy {name}';
这样定义意味着name是必选参数,当然还支持更多自定义参数输入:
{name?} //可选参数
{name=LaravelAcademy} //默认name值为LaravelAcademy
为增强程序健壮性,我们将name修改为有默认值:
protected $signature = 'laravel:academy {name=LaravelAcademy}';
有时候我们还会在执行命令时传入一些选项,比如是否显示标点符号(虽然听上去很鸡肋,这里权当测试之用), 那么我们可以修改$signature属性如下:
protected $signature = 'laravel:academy {name=LaravelAcademy} {--mark}';
如果调用命令时传递--mark则代表其值为true,否则为false,如果选项值在输入时通过用户设置,可定义$signature如下:
protected $signature = 'laravel:academy {name=LaravelAcademy} {--mark=}';
这样用户就可以在传入选项时通过=来为选项赋值,当然和参数一样,我们也可以为选项指定默认值:
protected $signature = 'laravel:academy {name=LaravelAcademy} {--mark=!}';
获取输入
定义好输入参数和选项后,又该如何获取其对应值呢?Laravel为我们提供了相应的方法。
获取参数值可以通过Illuminate\Console\Command的argument方法:
$name = $this->argument('name');
如果无参调用argument方法,则返回的是所有参数值数组。
获取选项值可以通过Illuminate\Console\Command的option方法:
$mark = $this->option('mark');
同理,无参调用option方法会返回所有选项值数组。
这样我们可以修改HelloLaravelAcademy的handle方法如下:
public function handle()
$name = $this->argument('name');
$mark = $this->option('mark');
$string = 'Hello '.$name;
if($mark)
$string .= $mark;
echo $string."\n";
这样我们在控制台输入如下Artisan命令:
php artisan laravel:academy
对应输出为:
Hello LaravelAcademy!
再运行如下Artisan命令:
php artisan laravel:academy Laravel --mark=?
对应输出为:
Hello Laravel?
输入提示
我们甚至还可以完全让用户通过在控制台输入name来获取输入参数,首先修改handle方法如下:
public function handle()
$name = $this->ask('What do you want to say Hello?');
echo "Hello ".$name."\n";
然后在终端输入php artisan laravel:academy,交互页面如下:
如果是输入密码一类的敏感信息可以用secret替代ask方法。
有时候我们会根据用户的意愿选择继续还是中止:
public function handle()
if($this->confirm('Do you want to continue?[y|n]')){
$this->info("Continue");
}else{
$this->error("Interrupt");
对应输出为:
除了让用户手动输入外,还可以使用anticipate方法实现自动完成功能:
public function handle()
$name = $this->anticipate('What is your name?', ['Laravel', 'Academy']);
$this->info($name);
当然还可以使用choice方法为用户提供选择避免手动输入,用户只需选择对应索引即可:
public function handle()
$name = $this->choice('What is your name?', ['Laravel', 'Academy']);
$this->info($name);
对应交互页面如下:
编写输出
关于输出字符串,上面我们简单使用了echo语句,其实Laravel提供了更为强大和多样化的方法:
public function handle()
$this->info("Successful!");
$this->error("Something Error!");
$this->question("What do you want to do?");
$this->comment("Just Comment it!");
执行php artisan laravel:academy对应输出如下:
表格
Artisan甚至可以输出表格:
public function handle()
$headers = ['Name', 'Email'];
$users = \App\User::all(['name', 'email'])->toArray();
$this->table($headers, $users);
执行php artisan laravel:academy对应输出为:
进度条
当然对于复杂耗时的命令,进度条是必不可少的,
public function handle()
$this->output->progressStart(10);
for ($i = 0; $i < 10; $i++) {
sleep(1);
$this->output->progressAdvance();
$this->output->progressFinish();
执行php artisan laravel:academy对应输出为:
5、从CLI之外调用Artisan
除了在控制台执行Artisan命令之外,还可以通过代码在别处调用Artisan命令,比如其它Artisan命令、控制器、路由或其他。
路由
在路由闭包中我们可以通过Artisan门面的call方法来调用本节创建的命令:
//在路由中调用Artisan命令
Route::get('testArtisan',function(){
$exitCode = Artisan::call('laravel:academy', [
'name' => 'Laravel学院', '--mark' => '!'
]);
});
其它Artisan命令
在一个Artisan命令中也可以调用另一个Artisan命令,还是通过call方法:
public function handle()
$this->call('inspire');
如果想要调用一个Artisan命令并阻止其所有输出,可以使用callSilent方法:
public function handle()
$this->callSilent('inspire');
号外:除此之外,关于Artisan命令你还应该知道的是我们可以在创建的命令类的控制器或方法中注入任何依赖。这就意味着我们可以在命令类中使用注册到服务容器的所有类。
Laravel
5.1
自定义
Artisan
控制台
命令
输入
输出
进度条
点赞
取消点赞
收藏
取消收藏
赞赏
分享到以下平台:
<< 上一篇:
Laravel 5.1 中的ACL用户授权及权限检查功能实现教程
>> 下一篇:
Laravel 支付解决方案之 Laravel Cashier (一)—— 安装配置篇
3 条评论
#1
星空
评论于 6年前
正在删除评论...
问下学院君:
php artisan vendor:publish --provider=“”有什么作用?
#2
学院君
评论于 6年前
正在删除评论...
https://xueyuanjun.com/post/216.html#ipt_kb_toc_216_8
#3
星空
评论于 6年前
正在删除评论...
谢谢
登录后即可添加评论
升级为学院君订阅用户(新年优惠🎁)
内容导航
1、入门
2、创建命令
3、运行命令
4、更多样的输入输出
定义输入
获取输入
输入提示
编写输出
5、从CLI之外调用Artisan
路由
其它Artisan命令
相关推荐
Artisan 控制台
Laravel 5.7 中文文档
进阶系列
在 Laravel 中编写高级的 Artisan 命令
Laravel 入门到精通教程
命令行交互篇
Artisan 控制台
Laravel 5.8 中文文档
进阶系列
控制台测试
Laravel 5.8 中文文档
测试系列
控制台测试
Laravel 6 中文文档
测试系列
回到顶部
2022 基于 Laravel 6 构建
关于学院
订阅服务
友情链接
站点地图
本站 CDN 加速服务由又拍云赞助