3分钟短文:胆儿真肥!Laravel在命令行问用户要数据!
引言
上一章我教会大家如何在3分钟的时间,通过laravel跻身geek之列(听一下就好[捂嘴.jpg])。实现了一个简单的命令行,和一个复杂的发送邮件通知的功能。 可是细心的读者你发现了没有,使用自定义的命令行,全程我们没有输入一个参数,没有一个数据,这,这,这,太不寻常了吧!
linux下的命令,没有一个是不带参数自己玩儿的!所以本文教你改造命令行,做一个标准的应用程序。
事前询问
首先我们要区分获取参数的两种方式,一种是在输入命令行时直接给定的,还有一种是在程序运行过程中,等待用户输入信息之后才能继续。 先说第一种方式,也分为两种,一种叫参数 argument,一种叫选项 option。在laravel程序里,这两个名字没有变化。
比如,有一个密码重置的命令行工具,要求传入一个 userId 用于标记用户的身份,在类的声明中指明使用方式:
protected $signature = 'password:reset {userId}';
假设上述类已经完成功能开发,在命令行中调用:
php artisan password:reset 5
在代码中使用 $this->argument() 方法,打印其结果是一个数组,内容如下:
[
"command": "password:reset",
"userId': "5",
]
如果要返回指定的参数值,只需传入键名即可:
$this->argument('userId'); // 5
返回的就是命令行上传送的参数。这个 {userId} 的写法就是 argument,称为 参数。
还有一种方式是选项 option,声明的时候,要在方法内这样写:
protected $signature = 'password:reset {--userId=}';
这就是声明一个选项了,使用命令行的时候数据传送方式也不一样:
php artisan password:reset --userId=5
程序里要用 $this->option() 来获取,打印数组内容如下:
[
"userId" => "5"
"help" => false
"quiet" => false
"verbose" => false
"version" => false
"ansi" => false
"no-ansi" => false
"no-interaction" => false
"env" => null
]
比 argument 打印的内容丰富的多,为什么?因为那些事laravel Command 类默认追加上的,只要继承了基类都天然自带这些选项。
用法类似,获取单个的选项值,只要传入键名就可以了:
$this->option('userId');
为了演示两个方法的用法,我们为命令行调用方式声明两种获取参数的方式:
protected $signature = 'password:reset {userId : user ID} {--sendEmail : Send email or NOT}';
在程序里我们要分别获取,下面是手动实现 handle 处理方法:
public function handle()
{
// 所有参数
$arguments = $this->argument();
$userid = $this->argument('userId');
// 所有选项
$options = $this->option();
$sendEmail = $this->option('sendEmail');
}
事中确认
有些参数是要在程序运行中对用户进行询问,下面就介绍几个常用的方法。
ask方法需要用户输入字符串内容:
$email = $this->ask('What is your email address?');
如果输入的是密码敏感数据,默认是不能展示在终端的,使用 secret方法:
$password = $this->secret('What is the password?');
有时候是询问用户是或者否,那就用 confirm方法:
if ($this->confirm('Do you want to reset the password?')) {
//
}
还有一些,尽量减少用户输入,使用选项的方式,让用户选,这样输入的采集数据基本不会出错。使用 choice方法:
$level = $this->choice('What is the level?', ['low', 'middle', 'high'], 0);
有这几个助阵,基本上够用了,做一个有些复杂的中型的命令行工具,只要PHP还运行的动,处理的来,基本没啥问题。
写在最后
本文我们讲述了两个重要的概念,参数和选项。在设计命令行的时候一定要想清楚,规划好,到底用哪一个,在代码中才能有的放矢地读取。并且使用询问等待可以制作更多灵活的引导型程序,非常实用。
Happy coding :-)
我是@程序员小助手,专注编程知识,圈子动态的IT领域原创作者
- CentOs7.3 搭建 RabbitMQ 3.6 单机服务
- Redis实现信息已读未读状态提示
- HashMap源码理解
- JSP Layout详细介绍
- J2Cache——Java两级缓存框架
- SSM三大框架整合详细总结(Spring+SpringMVC+MyBatis)
- 不到百行代码实现,类似iPhone的滑块开关
- 《深入理解Java虚拟机》(一)Java虚拟机发展史
- Servlet是如何实现MVC的?
- 基础篇章:关于 React Native 的props,state,style的讲解
- 《深入理解Java虚拟机》(三)垃圾收集器与内存分配策略
- 一个类似于进度和打卡进度的自定义view
- 《深入理解Java虚拟机》(四)虚拟机性能监控与故障处理工具
- 第七章:Shiro的Session管理——深入浅出学Shiro细粒度权限开发框架
- php概述
- php教程
- php环境搭建
- PHP书写格式
- php变量
- php常量
- PHP注释
- php数组
- php字符串 string
- PHP整型 integer
- PHP浮点型 float
- php布尔型
- php数据类型之数组
- php数据类型之对象
- php数据类型之null
- php数据类型之间的转换
- php运算符
- php表达式
- PHP循环控制
- PHP流程控制
- php函数
- php全局变量
- PHP魔术变量
- php命名空间
- php 日期
- PHP包含文件
- php文件
- PHP 文件上传
- php Cookies
- php Sessions
- php email
- php安全email
- php错误处理
- PHP异常处理
- php过滤器
- PHP 高级过滤器
- php json
- php 表单
- PHP MySQL 简介
- PHP 连接 MySQL
- php创建数据库
- php 创建表
- php mysq 插入数据
- PHP MySQL 插入多条数据
- PHP MySQL 预处理语句
- php mysql 读取数据
- php mysql where
- PHP MySQL Order By
- PHP MySQL Update
- PHP MySQL Delete
- php ODBC
- Android 开发使用PopupWindow实现加载等待界面功能示例
- Android自定义控件实现圆形进度CircleProgressBar
- Android Studio如何查看源码并调试的方法步骤
- Flutter中mixin的使用详解
- android实现圆形渐变进度条
- 如何在Android Studio下进行NDK开发
- flutter中build.gradle仓库的配置(解决外网下载速度过慢失败的问题)
- Android studio 实现随机位置画10个随机大小的五角星的代码
- 详解Android Studio实现用户登陆界面demo(xml实现)
- Flutter 实现进度条效果
- Android 侧边滑动关闭Activity的示例代码
- Flutter 系统是如何实现ExpansionPanelList的示例代码
- Flutter中如何使用WillPopScope的示例代码
- Android实现音乐播放进度条传递信息的两种方式(在service和activity中)
- Flutter 中 Dart的Mixin示例详解