laravel/lumen —— Artisan Console 命令行

1、 简介

laravellumen提供了artisan命令行接口,以便我们来进行命令行操作。

我们可以通过php artisan list来查看框架为我们提供了哪些接口。

也可以用help命令来查看,如何使用命令。

2、编写命令

laravel的话你可以直接使用命令行来创建命令。

你还可以使用--command参数来设置终端命令名。

这样app\Console\Commands目录下就多了SayHello这个类。

变量protected $signature = 'say:hello'; 就是刚刚设置的终端命令名。
变量protected $description = 'a test command, just say hello';是用来描述改名了作用的。

我们可以将我们想做的操作写入handle方法。

接下来我们将该命令注册到App\Console\Kernel中就可以执行了。

通过php artisan list命令可以查看到,say:hello已经注册成功。

执行命令

3、交互命令

3.1、 自定义参数

我们可以通过以下方式进行传参。

还可以让该参数可选可不选,以及定义默认的可选参数值:

使用argument方法可以来获取参数

通过php artisan say:hello cc来进行调用

还有一种传出方式,可以通过--方式来进行传参。

这种方式我们需要用option方法来接收参数。

如果--queue开关被传递,其值是true,否则其值是false

也可以将其改造成传值方式

简写方式

传数组

3.2、 输入提示

我们将命令改回say:hello不传参数形式。

输入提示分4种模式:

  • 询问
  • 密码
  • 确认
  • 选择

询问模式

不输入内容,自定会进行重试操作。

密码模式

密码模式输入字符不会再命令行中显示。但是需要开启exec的函数使用权。

确认模式

默认为no,只有输入yYyesYES才算通过

选择模式

第一种anticipate用户可以无视给出的提示,自己填写。

第二种choice,用户必须选择提示中的选项,否则失败。

3.3、 不同的输出样式

4、调用command

我们可以在routes.php中去调用命令。当然,这只是个例子,你可以在任何地方调用它。

仓库模式 —— Repository Pattern

在上一篇文章《laravel/lumen —— 面向接口编程》中,举了个RedisConfig的栗子,涉及到了仓库模式这个概念,但是还不够深入。现在特别再写一篇来讲述仓库模式的使用方式以及优势。

Repository 模式主要思想是建立一个数据操作代理层,把controller里的数据操作剥离出来,这样做有几个好处:

  • 把数据处理逻辑分离使得代码更容易维护
  • 数据处理逻辑和业务逻辑分离,可以对这两个代码分别进行测试
  • 减少代码重复
  • 降低代码出错的几率
  • controller代码的可读性大大提高

以下演示时基于lumen框架的。

一般我们都会在controller中回去数据,然后处理展示到页面。如下:

但是这段代码有几个问题:

  1. 控制层与数据层耦合
  2. 严重依赖Model
  3. 无法写单元测试

所谓控制层与数据层耦合就是目前数据来源是本地数据库,如果将来该成服务化了,数据来源将会是远程服务,这个时候我们就不得不改写这个控制层。那么久违反了开闭原则。

严重依赖Model的意思就是,如果控制层和Model由2个开发人员开发,那么控制层不得不等待Model的完成才能继续工作。

由于数据严重依赖Model层,所以无法写出各种数据格式的单元测试来进行测试。

好的单元测试时重构的基础。也就无法进行重构。

接下来我们就引入仓库模式来进行改造。这里我们会借助一些laravel/lumen框架的基本特性,比如说:服务容器,依赖注入。如果你对这些不熟悉,那么请先进行了解。

第一步:完成“仓库”

我们在app目录下建立仓库文件夹。

  • app
    • Repositories
      • Interfaces
      • Instances

Interfaces里面是“面向接口编程”的接口,Instances里面是实现接口的类。

记下来我们编码工作。先写一个ContentRepositoryInterface的接口,建立规范。
再写3个类ContentLocalRepositoryContentHttpRepository以及ContentCustomerRepository,表示三个不同数据来源:本地、远程HTTP以及自定义数据。

OKdc class="crayon-line crayo> inf(dc class="crayon-line crayocn ccdc class="crayon-line crayo> testsdc class="crayon-line crayo>infan class=y">, /spartionsdc class="crayon-line crayo>infpan classtant; -moz-tab-size:4; -o-taaces)19
) dc9741 dc9741