php-cli下编程如何分层架构、面向对象、统一入口文件?

php-cli下编程如何分层架构、面向对象、统一入口文件?以往写cli下运行的业务或者测试代码,总是新建文件,面向过程编写代码。几次之后,cli目录下好多文件,即便勉强在一个cli测试文件中写了一个类,

欢迎大家来到IT世界,在知识的湖畔探索吧!

以往写cli下运行的业务或者测试代码,总是新建文件,面向过程编写代码。几次之后,cli目录下好多文件,即便勉强在一个cli测试文件中写了一个类,也是让其中的一个方法自启动,要测试别的方法,总是要修改代码,很是繁琐。昨天接触了phalcon的cli, 犹如醍醐灌顶, 特此发文分享。

首先,温故而知新:

在浏览器中访问php:

http(s)://test.php.local/index.php?m=front&c=order&a=getList&p=2&cate=1

欢迎大家来到IT世界,在知识的湖畔探索吧!

调试期间,每次都敲m、c、a,太繁琐了,url简化一下:

欢迎大家来到IT世界,在知识的湖畔探索吧!http(s)://test.php.local/index.php/front/order/getList?p=2&cate=1

然后,index.php会做的事情必定包括:

  • 加载配置文件
  • 加载Autoload.php, 各种function.php
Dispatcher::run();
  • 初始化Db类(此时并没有连接mysql)
  • 分析url, 得到front/order/getList, 之后,
欢迎大家来到IT世界,在知识的湖畔探索吧!$obj = new /app/front/controller/Order();
$obj->getList(); //别担心Autoload类帮我们自动加载类文件
  • ….

在cli中,我们这样访问php:(先用cd进入项目根目录)

php public/cli.php	--m cli --c order --a updateMarketPrice --param value

文件名之后,就是“–参数 值 –参数 值 ” 这么有规律,可以直接用getopt()获取m、c、a参数:

$arr = [ 'm:', 'a:', 'c:' ];
$mca = getopt( '', $arr );

注意,如果企图简化为:

php public/cli.php/cli/order/updateMarketPrice --param value

那么在linux中,public/cli.php/cli/order/updateMarketPrice会被认为是一个文件,因为不存在,导致打开失败

php-cli下编程如何分层架构、面向对象、统一入口文件?

据本猿所知,有2种简化方式:

php public/cli.php cli/order/updateMarketPrice --param value
或者
php public/cli.php cli order updateMarketPrice --param value

文件名之后,不是以–开头, getopt()不认识,就罢工了,还好有php自带的全局变量$argv,它是一个数组(以第2种方式为例):

php-cli下编程如何分层架构、面向对象、统一入口文件?

之后,便是分析$argv这个数组,取得m、c(此处实际应该叫t, task)、a, 组合数组$paramsArr, 以便给业务方法用。

cli.php必然也做以下事情:

  1. 加载配置文件
  2. 加载Autoload.php, 各种function.php
CliDispatcher::run();
  • 初始化Db类(此时并没有连接mysql)
  • 分析url, 得到front/order/getList, 之后,
$obj = new /app/cli/task/Order(); 
$obj->updateMarketPrice($paramsArr); //别担心, Autoload类帮我们自动加载类文件
  • ….

注意:

  • 另起CliDispatcher类。 Dispatcher类已经通过了重重考验,不要再动它了,再说,这也不符合面向对象的原则之一:对扩展开放,对修改关闭
php-cli下编程如何分层架构、面向对象、统一入口文件?

  • 使用Task而不是controller, 是为了避免这样的情况:

控制器中业务需要调用cli模块中的方法发送微信模板消息什么的,代码写着写着,走神了,直接new /app/cli/task/Order();

由于AutoLoad类认定控制器一定在controller目录在,而cli模块却是放在task目录下,导致加载失败,抛出错误, 同时输出建议,就像一盆凉水一样立即“浇醒”开发者,想想,要是cli模块是放在controller目录下, 还被顺利执行…

和cgi下不同,没有$_GET, 没有$_POST, 而且$_SERVER中关于url的各种信息也是没有的,记得给予参数,不然,取参(“餐”)无门..

$obj->updateMarketPrice($paramsArr);

  • cli模块的各种logic类, 记得判断是否php是否在cli下运行,以免被其他cig下运行的模块直接调用

各位小伙伴,请在评论中留下你的见解。

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/34751.html

(0)
上一篇 2023年 12月 6日 下午12:00
下一篇 2023年 12月 6日 下午9:00

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们YX

mu99908888

在线咨询: 微信交谈

邮件:itzsgw@126.com

工作时间:时刻准备着!

关注微信