vertwo/plite

版本2 PHP框架

dev-master 2023-06-14 21:22 UTC

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服务器环境变量提供两种机制来引导配置

  1. 生产环境:配置从扩展了PliteFactory并实现loadDefaultConfig()方法的PHP类加载。此方法返回一个哈希(关联数组),其中包含所有相关的配置,包括Plite需要的配置以及任何任意配置。

  2. 开发环境:配置从本地、开发者控制的文件系统中加载**一个文件。该文件必须位于开发者控制的目录下,或通过SetEnv vertwo_local_root访问(例如,在macOS上为/Users/srv,在Linux上为/srv)。并且,应用程序的配置必须是该目录的子目录(例如,在macOS上为/Users/srv/,在Linux上为/srv/)。因为开发人员可以同时处理多个基于Plite的应用程序,我们必须能够从URL中确定应用程序名称(即<app>)文件。实际上,它允许开发机器上的URL充当一个“虚拟应用程序”,类似于“虚拟主机”,至少在应用程序配置方面。

详细说明

  1. 生产环境。Web服务器环境变量必须包含应用程序名称(SetEnv plite_app)以及配置类的完整限定PHP类名前缀(SetEnv plite_fq_class_prefix);即包括命名空间,同时考虑到可能适用的任何转义规则(例如,在Apache中,SetEnv不能有裸的\,因此PHP命名空间分隔符必须看起来像\\(例如,org\\project\\Abc,它扩展为org\project\AbcPliteFactory)。
  2. 开发环境。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;
    }

那么,如果没有给出提示,输出将看起来像这样

plite-clog-example

太棒了。