通用企业框架

1.0.1 2024-08-30 12:08 UTC

This package is auto-updated.

Last update: 2024-09-25 16:58:34 UTC


README

简介

这是一个使用其他框架(如Laminas、twig等)来解决PHP中某些业务问题的最小化框架。定义数据库层,如DataMappers,将其映射到数据库表和PDO出现之前开发的数据库抽象层。

这个库是业务应用程序的一部分,目前处于独立库的开发阶段。

功能

  • 应用程序配置层

  • 数据库支持

    • 抽象BD驱动层,包括
      • Firebird
      • Oracle
      • SQLAnywere
      • PostgreSQL
    • 实体数据模型抽象层:DataMapper、Record和ResultSet。
  • 使用K-V存储(REDIS、MEMCACHED)的数据存储模型抽象层。

  • 数据导出功能,可以定义不同的输出格式的DataReport:XSL、JSON或PDF。

  • 任务抽象层以执行作业服务器上的任务,实际版本仅支持Gearman。

  • 集成缓存到:REDIS、Memcached或基于文件。

  • 网络层实用工具

    • 控制器类
    • 模板引擎:支持多个模板库,现在支持twig和patTemplate。
    • API REST实现控制器

此外,还包含用于连接到ImesD Electrónica生物识别终端系统的驱动程序,支持的型号包括

  • CP-5000
  • CP-6000

使用库

这个库是composer包,可在packagist.org包仓库中找到。可以从您的当前应用程序中使用它,或者可以使用此框架创建Web应用程序。

composer require phiconsultors/gcf

创建GCF应用程序

您需要初始化composer项目应用程序,然后执行composer require

composer init
composer require phiconsultors/gcf

现在您需要创建类似于以下的基本应用程序结构

Myapp
│   composer.json
│   init.php
├───cfg
│   └───properties_dev.ini
├───app
├───data
│   └───models
└───frontal
    │   index.php
    │
    ├───cfg
    ├───modules
    ├───static
    │   ├───css
    │   ├───img
    │   └───jscript
    └───templates
            index.twig

在包含init.php以初始化应用程序环境的根目录。在此示例中,只有一个简单的index.php,它初始化配置环境并渲染简单的TWIG模板。

<?php

/**
 * Application initialization
 */

use gcf\Environment;

include __DIR__."/vendor/autoload.php";

try {
        $env = Environment::getInstance("MyAppName");
} catch (Exception $ex) {
        die($ex->getMessage());
}

此文件包含在主php(例如:index.php)程序中,用于初始化GCF上下文。

以及composer.json,其中包含项目依赖项和一般配置。此文件由composer init自动生成

{
    "name": "tomeu/myapp",
    "description": "Example application",
    "type": "project",
    "license": "GPL",
    "authors": [
        {
            "name": "Tomeu Capó",
            "email": "tomeucapo@gmail.com"
        }
    ],
    "minimum-stability": "stable",
    "require": {}
}

如果您需要应用程序骨架,可以克隆应用程序示例

基本用法

您可以在不初始化环境和配置的情况下使用此库的一些组件/类。但是,如果您需要创建具有数据库访问和缓存的程序,则需要创建环境和配置。环境读取包含所有应用程序属性的配置ini文件,并初始化所有数据库连接池和缓存连接。

  • 环境

    单例类,用于创建应用程序基本上下文,根据环境部署名称解析应用程序属性文件,并初始化数据库连接池属性(connectionDb)(用户、密码等)。

  • ConfiguratorBase

    这是一个抽象类,您需要在应用程序的app目录中创建自己的Configurator类,扩展它,并添加应用程序所需的方法。

数据库驱动程序

根据您的应用程序属性,GCF选择与数据库后端一起工作的数据库驱动程序。

您可以使用SQL语句使用

  • SQLQuery类执行任何SQL语句到您的数据库。

或创建数据库上的自己的模型,使用模型抽象数据层

  • DataMapper类将数据库表映射到PHP类,该类对DB表执行操作。
  • Record类将单个表记录存储在其中。
  • ResultSet类。迭代器类类型,您可以使用foreach迭代,并在foreach的每个步骤中按记录获取记录。

查询

要直接执行任何查询,可以调用SQLQuery类并处理结果,如下所示

$myQuery = new SQLQuery($db);
$myQuery->fer_consulta("select ID, USER, NAME from user where id=3");

while(!$consulta->Eof())
{
    $user = $consulta->row['USER'];
    $name = $consulta->row['NAME'];
    
    $consulta->Skip();
}

$consulta->tanca_consulta();

这是一个传统的使用原语获取记录直到表末的方法。

db 是一个 DatabaseConnector 类型,可以从扩展自 ConfiguratorBase 的 Configurator 类中获取,使用 Configurator::getInstance()->db。

另一种方法是使用 ResultSet,简化代码。

$myQuery = new SQLQuery($db);
$myQuery->PrepareQuery("select ID, USER, NAME from user where id=3");

foreach (new ResultSet($myQuery, "ID") as $record)
{
    // Can access each field with, for example: $record->USER or $record->NAME and so on.
}

通常建议创建自己的 ResultSet 和自己的 Record,以准确定义每条记录的字段和返回当前 ResultSet 记录的正确类型。

模型

通常,如果您需要处理您的表,我建议为每个表创建一个模型。每个模型直接扩展到 DataMapper,或者类扩展 DataMapper。当您使用主数据库连接创建应用程序时,建议创建一个主基类(例如:MyAppDatabaseModel),它扩展 DataMapper 如下所示

class MyAppDataMapper extends DataMapper
{
    /**
     * @var DatabaseConnector
     */
    protected DatabaseConnector $dbContext;

    /**
     * @throws errorDatabaseConnection
     * @throws errorDriverDB
     * @throws errorDatabaseAutentication
     */
    public static function GetDBContext() : DatabaseConnector
    {
        $dbPool = connectionPool::getInstance();
        return $dbPool->maindbname->getConnection();
    }

    /**
     * Data\models\taulaBDPersonal constructor.
     * @param string $tableName
     * @param mixed $pk
     * @param mixed $pkType
     * @throws errorDatabaseAutentication
     * @throws errorDatabaseConnection
     * @throws errorDriverDB
     */
    public function __construct(string $tableName, $pk, $pkType)
    {
        $this->dbContext = self::GetDBContext();
        parent::__construct($this->dbContext, $tableName, $pk, $pkType);
    }

如果您需要创建模型

class User extends MyAppDataMapper
{
    public function __construct($tableName="USER", $pk="ID", $pkType="int") 
    {
        parent::__construct($tableName, $pk, $pkType);
    }
}

pk 定义一个单字段主键,pyType 是类型(支持 int 或字符串)。如果您有复合键,您需要将字段名称和类型的数组传递给 pkpkType 这两个参数。

请注意,DataMapper 使用魔法方法来访问表中的每个字段。因此,您需要在类声明之前放置注释,包含属性列表,以帮助 IDE 检测。

/**
 * Class User
 * @property int ID
 * @property string USER
 * @property string NAME
 */
class User extends MyAppDataMapper
{
    public function __construct($tableName="USER", $pk="ID", $pkType="int") 
    {
        parent::__construct($tableName, $pk, $pkType);
    }
}

要从代码的任何部分使用此模型,可以这样做,在 USER 表上创建新记录

$user = new User();
$user->ID = 3;
$user->USER = "tomeu";
$user->NAME = "Tomeu Capó";
$user->Nou();

或使用此方法根据 PK 删除记录

$user = new User();
$user->Borra(3);

或使用此方法使用 PK 修改记录

$user = new User();
$user->NAME="Pep";
$user->Modifica(3);

模块

GCF 是模型-视图-控制器框架,可以帮助创建任何 API 控制器、Web 控制器、视图(模板)和模型,如前所述。模块定义了控制器部分。类 modulBasecontrollerBase 定义了此功能,并帮助创建所需的控制器。要使用模块,您需要实例化 Router 来管理对模块的请求。

controllerBase

此类定义了控制器基类。这是能够为应用程序创建新控制器的基本类。此类不支持视图,仅支持基本控制器,如 API 控制器。如果需要,提供数据库连接上下文、日志上下文、应用程序配置上下文和基本过滤器输入类,其中包含来自客户端的数据。

modulBase

controllerBase 扩展并包含模板(视图)功能。通常,当您创建返回从数据库数据解析的动态 HTML 的视图时,使用 modulBase。

  • modulBaseCRUD 定义特定数据库模型(表)的所有方法。
  • modulConfig 可以加载控制器的 json 配置文件。
  • modulBaseDefaultMethods 在控制器上创建所需的控制器接口的占位符方法。仅适用于某些特殊情况。