3分钟短文:胆儿真肥!Laravel在命令行问用户要数据

引言上一章我教会大家如何在3分钟的时间 , 通过laravel跻身geek之列(听一下就好[捂嘴.jpg]) 。 实现了一个简单的命令行 , 和一个复杂的发送邮件通知的功能 。可是细心的读者你发现了没有 , 使用自定义的命令行 , 全程我们没有输入一个参数 , 没有一个数据 , 这 , 这 , 这 , 太不寻常了吧!
3分钟短文:胆儿真肥!Laravel在命令行问用户要数据文章插图
linux下的命令 , 没有一个是不带参数自己玩儿的!所以本文教你改造命令行 , 做一个标准的应用程序 。
事前询问首先我们要区分获取参数的两种方式 , 一种是在输入命令行时直接给定的 , 还有一种是在程序运行过程中 , 等待用户输入信息之后才能继续 。先说第一种方式 , 也分为两种 , 一种叫参数 argument , 一种叫选项 option 。 在laravel程序里 , 这两个名字没有变化 。
比如 , 有一个密码重置的命令行工具 , 要求传入一个 userId 用于标记用户的身份 , 在类的声明中指明使用方式:
protected $signature = 'password:reset {userId}';假设上述类已经完成功能开发 , 在命令行中调用:
php artisan password:reset 5【3分钟短文:胆儿真肥!Laravel在命令行问用户要数据】在代码中使用 $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领域原创作者