3分钟短文:Laravel写个命令行,你就是下一个Geek!

简介: 年轻人,说的就是你咯

引言

习惯了在windows下敲敲点点的同学,习惯了没有窗口视图就无从下手的同学,来到linux第一个面临的问题就是,core发行版根本不提供gui,太费空间,太费资源,要啥窗口?
所以电影里看到很多懂的,不懂的,懂的装不懂的,不懂的装懂的那么演员们,都在奋力敲击键盘,一串串荧幕输出像火箭似的飞速狂奔。这大概只有拷贝文件,或者debug时才能有的盛举吧。

img

没错儿,在linux下,你是PC小白也好,是行业大神也罢,都得敲那么两下子,这叫——“专业”。
本文给那些想写个命令行程序,体验一把geek范的同学一次机会,教你3分钟内迅速跻身geek之列。

代码时间

使用脚手架指令生成一个命令行类:

php artisan make:console WelcomeNewUsers --command=email:newusers

该指令在 app/Console/Commands/ 文件夹下生成一个 WelcomeNewUsers.php 的类,因为使用了 --command 选项,所以类内指定了命令调用的名字。

namespace App\Console\Commands;
use Illuminate\Console\Command;
class WelcomeNewUsers extends Command
{
    protected $signature = 'email:newusers';
    protected $description = 'Command description';
    public function __construct()
    {
        parent::__construct();
    }
    public function handle()
    {
        //
    }
}

这就是文件的原始内容,我们需要实现的逻辑,可以在 handle 方法内任意书写了。这是实现代码逻辑的地方,我们先把整个流程的架子搭完,然后再细化代码。下面该注册这个命令了,在文件 app/Console/Kernel.php 文件内添加下面的配置项:

protected $commands = [
    \App\Console\Commands\WelcomeNewUsers::class,
];

新建的命令行类必须在此引入才能够被 Artisan 正确地调用。

为什么不用一个 hello world 的示例呢,直接打印出来不是更简单?当然可以,下面就是在命令行打印 hello world 字符串:

public function handle()
{
    $this->output->info('hello world');
}

编辑完毕,保存文件后,打开命令行,并进入到项目的根目录,执行下面的指令:

php artisan email:newusers

如无意外,命令行上就会打印出绿色字体的 hello world了。

演示命令太过简单了,注意我们创建此命令类的初衷,是给新用户发一封电子邮件,欢迎他们的注册。所以下面给 WelcomeNewUsers 类的 handle 方法实现一些代码,

public function handle()
{
    User::signedUpThisWeek()->each(function ($user) {
        Mail::send(
            'emails.welcome',
            ['name' => $user->name],
            function ($m) use ($user) {
                $m->to($user->email)->subject('Welcome!');
            }
        );
    });
}

这个处理方法有些复杂,我一项一项讲给你听。

第一项,User 类是一个模型类,用于操作users表的数据。其中 signedUpThisWeek() 方法是我们手动注册的 本地作用域,也就是说在 User 类内有一个本地作用域的方法,代码如下:

public function scopeSignedUpThisWeek($query)
{
    return $query->where('created_at', '>', Carbon::now()->subWeek());
}

筛选出所有创建时间在本周的用户。该方法继承了 Model 类,返回的的是一个 Eloquent Collection,所以直接使用集合的 each 方法用于遍历查询后的集合内的对象。遍历方法内是邮件发送的所有逻辑,这个我们会在后面的邮件和通知章节中专门讲述。

书写完毕后在命令行内使用

php artisan email:newusers

就会执行用户查询和邮件发送的流程。

写在最后

本文我们使用了laravel的 Command 类创建了一个简单的示例代码,并手动实现了一个相对复杂的模型查询和邮件发送类。想要实现这个功能还有很多工作要做,包括数据库的配置,服务器配置等等。所以,大家不必着急,慢慢我们都要讲到。

Happy coding :-)

我是@程序员小助手,专注编程知识,圈子动态的IT领域原创作者

相关文章
|
2月前
|
Ubuntu Linux Docker
OrangePi 学习摘录
OrangePi 学习摘录
18 1
|
5月前
|
C语言 Python
专为编程小白设计的Python零基础入门教程,GitHub星标破W
市面上大多数技术类的书籍都着重于一步步的构建系统的知识体系,并不是说这样就是不对的,但这样按部就班的学习注定了需要花费大量的时间用来掌握“基础知识”,或死记硬背,或慢慢理解。 然而世界不会迁就你,而是在步步紧逼的告诉你要赶紧学完,赶紧找工作,赶紧挣钱,这才是你生活的基础。 今天给小伙伴们带来了一份《编程小白的第一步Python书》,这本书是专为零基础小白设计的,不会告诉“先学C语言,会更好理解Python”这种狗屁道理。而是先带你掌握搭建项目所用到的最少得知识,再真实的项目搭建中实践自己的所学,逐渐的完善知识体系。
|
11月前
|
人工智能 大数据 API
一句提示词生成整个代码库——Gpt Engineer神级项目开源(附演示视频)
一句提示词生成整个代码库——Gpt Engineer神级项目开源(附演示视频)
160 0
|
人工智能 JSON API
迎战2022 - Python中文翻译《环球时报》整篇文章实战演示,调用有道翻译API接口进行英文转中文翻译实例训练
迎战2022 - Python中文翻译《环球时报》整篇文章实战演示,调用有道翻译API接口进行英文转中文翻译实例训练
156 0
|
存储 芯片
[oeasy]python0093_电子游戏起源_视频游戏_达特茅斯_Basic_家酿俱乐部
[oeasy]python0093_电子游戏起源_视频游戏_达特茅斯_Basic_家酿俱乐部
117 0
[oeasy]python0093_电子游戏起源_视频游戏_达特茅斯_Basic_家酿俱乐部
|
机器学习/深度学习 人工智能 Python
Python3,为了考研,我用了9.9行代码,搞出一个GUI翻译器,从此再也不用百度翻译了。
Python3,为了考研,我用了9.9行代码,搞出一个GUI翻译器,从此再也不用百度翻译了。
36656 0
Python3,为了考研,我用了9.9行代码,搞出一个GUI翻译器,从此再也不用百度翻译了。
|
Shell 开发工具 开发者
上古神器Gvim--从入门到精通
上古神器Gvim--从入门到精通
197 0
上古神器Gvim--从入门到精通
|
自然语言处理 数据可视化 IDE
PyHubWeekly | 第二十一期:这款Python小工具让你的命令行多姿多彩!
PyHubWeekly每周定期更新,精选GitHub上优质的Python项目/小工具。 我把PyHubWeekly托管到了Github,感兴趣的可以搜索Github项目PyHubWeekly[1],如果喜欢,麻烦给个Star支持一下吧。此外,欢迎大家通过提交issue来投稿和推荐自己的项目~ 本期为大家推荐GitHub上5个优质的Python项目,它们分别是: •mplfinance •rich •babel •imgaug •xxh
PyHubWeekly | 第二十一期:这款Python小工具让你的命令行多姿多彩!
|
自然语言处理 Python
pycharm添加翻译插件和汉化插件,妈妈再也不用担心我英语不好啦
pycharm添加翻译插件和汉化插件,妈妈再也不用担心我英语不好啦
513 0
pycharm添加翻译插件和汉化插件,妈妈再也不用担心我英语不好啦