vertwo / plite
版本2 PHP框架
Requires
- ext-curl: *
- ext-json: *
- ext-openssl: *
- ext-pdo: *
- ext-pgsql: *
- ext-simplexml: *
- 2tvenom/cborencode: 1.0.0
- aws/aws-sdk-php: 3.234.4
- phpmailer/phpmailer: ^6.6
- phpseclib/phpseclib: ^3.0
Requires (Dev)
- phpunit/phpunit: ^9
This package is auto-updated.
Last update: 2024-09-15 00:07:34 UTC
README
PHP Lite框架
为与控制台视图日志、PHP作为CLI工具、处理基本的Web API请求、非常小的Postgres抽象以及抽象几个AWS服务(S3、SecretsManager和SES)和Twilio/Sinch/Plivo提供一些基本库。还附带一些帮助ETL的工具。
AWS抽象类还允许您在测试和开发过程中使用本地、离线的版本,这不需要AWS账户或访问其服务,但通过一系列小的配置更改,可以允许您的代码立即使用云资源(例如,使用AWS S3而不是本地文件系统)。
根据预期用途,此库有几个入口点。
用例:Web框架(后端)
当使用Plite作为Web框架时,
开发运维可以控制Web服务器环境变量(例如,SetEnv在Apache上)是一个绝对要求。
此外,整个框架中使用的应用程序名称必须是一个匹配
[[:alnum:]-_]
的字符串。
它使用Web服务器环境变量提供两种机制来引导配置
-
生产环境:配置从扩展了
PliteFactory
并实现loadDefaultConfig()
方法的PHP类
加载。此方法返回一个哈希(关联数组),其中包含所有相关的配置,包括Plite需要的配置以及任何任意配置。 -
开发环境:配置从本地、开发者控制的文件系统中加载**一个文件。该文件必须位于开发者控制的目录下,或通过
SetEnv vertwo_local_root
访问(例如,在macOS上为/Users/srv
,在Linux上为/srv
)。并且,应用程序的配置必须是该目录的子目录(例如,在macOS上为/Users/srv/
,在Linux上为/srv/
)。因为开发人员可以同时处理多个基于Plite的应用程序,我们必须能够从URL中确定应用程序名称(即<app>
)文件。实际上,它允许开发机器上的URL充当一个“虚拟应用程序”,类似于“虚拟主机”,至少在应用程序配置方面。
详细说明
- 生产环境。Web服务器环境变量必须包含应用程序名称(
SetEnv plite_app
)以及配置类的完整限定PHP类名前缀(SetEnv plite_fq_class_prefix
);即包括命名空间,同时考虑到可能适用的任何转义规则(例如,在Apache中,SetEnv不能有裸的\
,因此PHP命名空间分隔符必须看起来像\\
(例如,org\\project\\Abc
,它扩展为org\project\AbcPliteFactory
)。 - 开发环境。Web服务器环境变量必须包含顶级配置根(
plite_local_root
)和从localhost测试URL获取应用程序名称的正则表达式(plite_app
)。应用程序名称(vertwo_app
)必须是一个非空白、非标点符号(主要)字符串,可以从正则表达式(vertwo_url_app_regex
)中提取为\1
,例如,如果janedoe
是用户名,并且开发URL看起来像https:///~janedoe/app
,那么捕获的正则表达式将类似于:,localhost/~janedoe/([[:alnum:]-_]*)/,
,其中前导和尾部的,
是正则表达式分隔符。
用例:CLI
如果您使用此库创建命令行脚本(例如,带有shebang的可执行文件),则您的起点是类vertwo\plite\CLI
。
只需扩展CLI
并实现三个方法
main()
getShortOpts()
getLongOpts()
后两个方法是用于Unix风格的选项处理,可以返回空字符串和空数组。因此,对于hello-world示例,只需这样做即可
class HelloWorld extends CLI
{
protected function getShortOpts () { return ""; }
protected function getLongOpts () { return []; }
/**
* CLI entry point.
*
* @return int
*/
public function main ()
{
echo "Hello, world!\n";
return 0;
}
}
HelloWorld::run();
此外,如果您添加了shebang、PHP标签、use语句和require语句,然后使脚本可执行,您就可以在命令行界面(CLI)上直接执行这个PHP文件(当然,确保使用chmod +x或您操作系统需要的任何命令使程序可运行)。
显然,这比文件中的代码行数要多得多。
#! /usr/bin/php
<?php
echo "Hello, world!\n";
那么,为什么要忍受它呢?
原因只有一个:选项处理。
为了让PHP在Unix风格的shell环境中运行良好,脚本通常需要使用不同的参数来执行,以获得略微不同的行为。
假设我们的PHP脚本名为hello
。
假设我们想在程序中添加一个verbose开关,以便我们可以像这样调用它:
$ hello -v
然后,我们只需更改一行
protected function getShortOpts () { return "v"; }
然后我们可以这样使用它
public function main ()
{
if ( $this->hasopt("v") ) echo "About to print string!\n";
echo "Hello, world!\n";
return 0;
}
这使得CLI PHP更加高效。
假设我们想要一个长选项:--name your_name
然后,我们像这样更改getLongOpts()
的实现
protected function getLongOpts ()
{
return [
self::REQ("name"),
];
}
然后这样使用它
public function main ()
{
if ( $this->hasopt("v") ) echo "About to print string!";
if ( $this->hasopt("name") )
{
echo "Hello, world, " . $this->getopt("name") . "!\n";
}
else
{
echo "Hello, world!\n";
}
return 0;
}
太棒了。
以下是最终的(可能)可执行脚本
#! /usr/bin/php
<?php
use vertwo\plite\CLI;
require_once __DIR__ . "/../vendor/autoload.php";
class HelloWorld extends CLI
{
protected function getShortOpts () { return "v"; }
protected function getLongOpts ()
{
return [
self::REQ("name"),
];
}
/**
* CLI entry point.
*
* @return int
*/
public function main ()
{
if ( $this->hasopt("v") ) echo "About to print string!\n";
if ( $this->hasopt("name") )
{
echo "Hello, world, " . $this->getopt("name") . "!\n";
}
else
{
echo "Hello, world!\n";
}
return 0;
}
}
HelloWorld::run();
用例:日志记录
如果您只是使用这个库进行日志记录,您只需导入一个函数:vertwo\plite\clog
。
它使用vertwo\plite\Log
类,并将函数作为独立的函数加载到顶级的vertwo\plite
命名空间中。
如果您想知道为什么它被称为clog
,它是javascript记录器的缩写:console.log
。
使用起来很简单
clog("Hello, world!");
在CLI模式下,clog()
输出到stderr
,并使用ANSI转义序列来着色输出。它可以使用单参数模式(打印简单字符串)或更有用的双参数模式--打印arg 1(提示),然后是冒号:
,然后是arg 2(值)。
所以,想象一下我们的main()
函数看起来像这样:
public function main ()
{
if ( $this->hasopt("v") ) echo "About to print string!\n";
if ( $this->hasopt("name") )
{
echo "Hello, world, " . $this->getopt("name") . "!\n";
}
else
{
clog("Hello, world!");
clog("Hello", "world");
}
return 0;
}
那么,如果没有给出提示,输出将看起来像这样
太棒了。