专栏首页程序员小助手3分钟短文:胆儿真肥!Laravel在命令行问用户要数据!
原创

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领域原创作者

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • laravel Task Scheduling(任务调度)在windows下的使用详解

    laravel的任务调度是很好用的,因为Laravel提供了平滑而又富有表现力地调度器,并且服务器上只需要一个Cron条目即可,这使我们从编写手动写cronta...

    砸漏
  • 全局梳理、分析、总结 laravel 的核心概念

    Laravel 是 Taylor Otwell 开发的一款基于 PHP 语言的 Web 开源框架,采用了 MVC 的架构模式。

    八点半的Bruce、D
  • 【图观大数据】2014用大数据来聊聊床上那点儿

    何为大数据?举个简单的例子,苍井空出道11年,作品483部;吉泽明步出道5年,作品815部;而苍老师19岁出道,今年马上31岁;吉泽老师 25岁出道,今年将满3...

    小莹莹
  • 日本医疗再次被评为全球第一,中国位居第…

    世界卫生组织(WHO)在最新的报告《World HealthReport》中,从“医疗水平”,“接受医疗服务的难度”,“医药费负担公平性”等方面对世界各国的医疗...

    百味科研芝士
  • 一朝养猫,终身为奴!别挣扎了,快去救你主子吧!

    VRPinea
  • laravel 学习之路 数据库操作 Migrations

    团队合作的时候为了避免代码冲突,以及方便记录修改历史和回退我们有版本控制比如说 git svn

    风清醉
  • 资金与疯子扑向智能家居,2015是否爆发?

    ---- 今年CES归来有些伤感,感觉火了近十年的智能手机已进入“后手机时代”。不过更多的还是惊喜,因为真切感受到一个万物互联的新时代正在开启,各种智能产品百...

    机器人网
  • 中国医疗大数据发布!怎样推翻你身上的“三座大山”?

    大数据文摘
  • 深入理解Laravel定时任务调度机制

    一个复杂的web系统后台当中,一定会有很多定时脚本或者任务要跑。例如爬虫系统需要定期去爬取一些网站数据,自动还贷系统需要每个月定时对用户账户扣款结算,会员系统需...

    horstxu

扫码关注云+社区

领取腾讯云代金券