大教堂/构建者

数据库层构建库,具有基本Web和控制台界面

0.32.2 2022-02-22 18:01 UTC

README

快速入门

以下三步是启动和运行所需步骤,前提是你已经有一个运行中的数据库。

步骤1:注册静态适配器

Laminas 允许我们静态注册数据库连接,以便于引用。

编辑 bootstrap 方法在 Application\Module.php

/**
 * Bootstrap
 *
 * If you don't have a bootstrap method this one will do.
 *
 * @param MvcEvent $e
 */
public function onBootstrap(\Laminas\Mvc\MvcEvent $e): void {
    // Add this line to register the static method
    \Laminas\Db\TableGateway\Feature\GlobalAdapterFeature::setStaticAdapter($e->getApplication()->getServiceManager()->get('Laminas\Db\Adapter\Adapter'));
}

步骤2:注册构建者模块

注册构建者甚至更简单,只需将其添加到模块数组中。这将启用控制台和Web的UI。

编辑 config/development.config.php

    // Additional modules to include when in development mode
    'modules' => [
        'Cathedral\Builder',
    ],

这就完了!

通过使用 /builder 作为路由来打开Web界面。

例如: https:///builder

或者从命令行使用它

# list tables and file status
$ ./vendor/bin/laminas builder:list
# build command
$ ./vendor/bin/laminas builder:build

目前正在分割

Laminas 3 数据库层构建者,具有简单的Web和Console UI以及许多优秀功能。

有关快速修复和更改列表,请参阅 CHANGELOG.md

基于以下内容创建类

http://framework.zend.com/manual/current/en/user-guide/database-and-models.html

需求

  • PHP >= 8
  • Laminas 3(最新master版)

安装

我相信你们大多数人都能做到这一点,但是那些需要一点帮助的人。

使用composer

命令行

composer require --dev cathedral/builder

或者手动编辑 composer.json

将构建者添加到 composer.json 的 require 部分

    "require-dev": {
        "cathedral/builder": "dev-master"
    }

然后更新 composer

    $ php composer.phar update

安装后(可选)

在您的 development.config.php 文件中启用构建者GUI

    return [
        'modules' => [
            // ...
            'Cathedral\Builder',
        ],
        // ...
    ];

构建者GUI有一些选项,允许您快速自定义基本功能。启用构建者GUI后

  1. ./vendor/cathedral/builder/config/cathedral-builder.global.php.dist 复制到 ./config/autoload/cathedral-builder.global.php.php
  2. 按需更改设置。
    • namespace - 文件将被创建的模块以及创建文件的命名空间。默认为 Application
    • entity_singular - 此功能的开启/关闭开关。
    • singular_ignore - 为实体单数设置的表列表,使用 |(管道符)分隔。

构建您的数据层

构建者仅用于生成类,之后类只依赖于laminas,因此不需要在生产机器上将构建者作为依赖项。

首先

  • 在运行构建者之前,请确保任何自定义模块100%功能正常,否则它将回退到Application。
  • 使用WebUI:检查Web用户是否有对模块 src/{Model,Entity} 文件夹的写入权限
  • 使用控制台:检查您是否有对 src/{Model,Entity} 文件夹的写入权限

WebUI

打开 http://yoursite/builder

如果您希望构建者将文件保存到磁盘,则Namespace/Entity和Namespace/Model目录必须可由php写入。然后享受吧。

控制台

此外,还有控制台支持。控制台UI使用与Web UI相同的配置。在项目根目录中运行 php index.php 并查看Cathedral选项

使用: php index.php table list

    Listing of tables
    basics
        DataTable     :Ok
        EntityAbstract:Outdated
        Entity        :None

使用 build (datatable|abstract|entity|ALL) <table|ALL> [--write|-w] 您可以将内容重定向到文件 > path/to/file.php 或简单使用 -w 选项,构建者会为您完成。

只需使用 build ALL ALL -w 即可完成所有操作。

控制台快捷方式

  • builder build -w # 这为所有表创建所有文件
  • builder build ALL logs -w # 为日志表构建所有文件
  • builder build datatable ALL -w # 为所有表构建datatable文件

自定义构建者

以您自己的方式使用构建器。

单表

确定哪个模块将存放您的数据库代码,例如DBLayer

创建实体 & 模型命名空间目录(模块/DBLayer/src/DBLayer/{Entity|Model}

使用BuilderManager

use Cathedral\Builder\BuilderManager;

创建BuilderManager

$buildManager = new BuilderManager('DBLayer', ’mytable');

如果您不省略表参数,可以使用nextTable方法遍历所有表。这对于批量运行很有用。可能是最常见的用法。

指定表或通过nextTable加载后,将文件写入磁盘或显示到屏幕。

    //Echo to screen
    echo $buildManager->getDataTableCode();
    echo $buildManager->getEntityAbstractCode();
    echo $buildManager->getEntityCode();

    //Write to file
    $buildManager->writeDataTable();
    $buildManager->writeEntityAbstract();
    $buildManager->writeEntity();

这就是表的全部内容:)

遍历表

对于更新类到新版本等非常有用…… 对于许多表来说,比每个表3行代码要痛苦少得多:)

使用BuilderManager

use Cathedral\Builder\BuilderManager;

创建一个未指定表的BuilderManager

$buildManager = new BuilderManager('DBLayer');

在while循环中写入覆盖当前的DataTable和EntityAbstract,只有在找不到时才创建实体

while ($buildManager->nextTable()) {
    $buildManager->writeDataTable();
    $buildManager->writeEntityAbstract();
    $buildManager->writeEntity();
}

这就是所有表的全部内容:)

RESTful

现在Builder对表有简单的RESTful接口。

目前支持

  • getList(列出表和列出表中的行)
  • get(表中的单个行)

要获取表列表,请使用

get http://yoursite/builder/rest

result

{
    "code": 401,
    "message": "Tabels",
    "data": [
        "cities",
        "countries",
        "currencies",
        "settings",
        "users"
    ]
}

要列出表中的行,显示主键字段和值

get http://yoursite/builder/rest/settings

result

{
    "code": 0,
    "message": "SettingsTable List",
    "data": [
        {
            "name": "currency"
        },
        {
            "name": "db_version"
        }
    ]
}

列出行

get http://yoursite/builder/rest/settings/db_version

result

{
    "code": 0,
    "message": "Setting",
    "data": {
        "name": "db_version",
        "value": "1",
        "created": "2014-11-08 05:28:31",
        "modified": null
    }
}

功能/约定(假设)

EntitySingular

如果表名是复数,构建器将尝试将实体创建为单数形式。

支持大多数复数/单数约定。

例如。

Table countries
DataTable: CountriesTable
Entity: Country

Table catches
DataTable: CatchesTable
Entity: Catch

Table users
DataTable: UsersTable
Entity: User

禁用

但是,如果您想,您也可以完全禁用它。

// First we create a NameManger
$nm = new NameManager('Dossier');

// EntitySingular is enabled by default
// To check the status use:
if ($nm->entitySingular()) {
    // If enabled
    // To disable it:
    $nm->entitySingular(false);
} else {
    // If disabled
    // To enable it:
    $nm->entitySingular(true);
}

// Lets keep it enabled
$nm->entitySingular(true);

忽略列表

或将表添加到忽略列表中,跳过一些表。

// But lets tell it that a few tables ending in a plural should be ignored
// To reset the ignore list pass FALSE
$nm->setEntitySingularIgnores(false);

// Now lets add our ignore tables
// adding table1s
$nm->setEntitySingularIgnores('table1s');

// you can add them as an array or | (pipe) delimited string as well
$nm->setEntitySingularIgnores('table1s|table2s');
// OR
$nm->setEntitySingularIgnores(['table1s','table2s']);

关系

构建器检查MySQL信息表以关联表。

要获取相关记录,可以使用引用表的复数形式或单数形式。

例如:获取与组相关的用户

...
Table groups which contains users
Method: $group->User()
Entity: User
...

例如:获取与用户相关的所有组

...
Method: $user->Groups()
Entities: Group
OR
Method: $user->Groups(['active' => 1])
Entities: Group that also have active set to 1
...

事件

请参阅Laminas事件:Laminas-db

TableGateway生命周期事件

当在TableGateway实例上启用EventFeature时,您可以附加到以下任何事件,这些事件提供了对以下参数的访问。

  • preInitialize(无参数)
  • postInitialize(无参数)
  • preSelect,带有以下参数
    • select,类型为Laminas\Db\Sql\Select
  • postSelect,带有以下参数
    • statement,类型为Laminas\Db\Adapter\Driver\StatementInterface
    • result,类型为Laminas\Db\Adapter\Driver\ResultInterface
    • resultSet,类型为Laminas\Db\ResultSet\ResultSetInterface
  • preInsert,带有以下参数
    • insert,类型为Laminas\Db\Sql\Insert
  • postInsert,带有以下参数
    • statement,类型为Laminas\Db\Adapter\Driver\StatementInterface
    • result,类型为Laminas\Db\Adapter\Driver\ResultInterface
  • preUpdate,带有以下参数
    • update,类型为Laminas\Db\Sql\Update
  • postUpdate,带有以下参数
    • statement,类型为Laminas\Db\Adapter\Driver\StatementInterface
    • result,类型为Laminas\Db\Adapter\Driver\ResultInterface
  • preDelete,带有以下参数
    • delete,类型为Laminas\Db\Sql\Delete
  • postDelete,带有以下参数
    • statement,类型为Laminas\Db\Adapter\Driver\StatementInterface
    • result,类型为Laminas\Db\Adapter\Driver\ResultInterface

监听器接收一个Laminas\Db\TableGateway\Feature\EventFeature\TableGatewayEvent实例作为参数。在监听器内部,您可以使用以下语法从事件中通过名称检索参数

示例

快速示例

// Create Settings & User table objects
$settingaTable = new SettingsTable();
$usersTable = new UsersTable();

// Two simple select events to see it in action
$settingaTable->getEventManager()->attach('postSelect', function(TableGatewayEvent $event) {
    Logger::dump($event->getParam('result')->current(), 'TableGatewayEvent::Setting', false);
});

$usersTable->getEventManager()->attach('postSelect', function(TableGatewayEvent $event) {
    Logger::dump($event->getParam('result')->current(), 'TableGatewayEvent::User', false);
});

// More useful, if a user is added we can run some init setup tasks
$usersTable->getEventManager()->attach('postInsert', function (TableGatewayEvent $event) {
    /** @var ResultInterface $result */
    $result = $event->getParam('result');
    $generatedId = $result->getGeneratedValue();

    // do something with the generated identifier...
});

// More useful, if a setting is updated rebuild cache or ...
$settingaTable->getEventManager()->attach('postUpdate', function (TableGatewayEvent $event) {
    /** @var ResultInterface $result */
    $result = $event->getParam('result');
    $generatedId = $result->getGeneratedValue();

    // do something with the generated identifier...
});

$user = $usersTable->getUser(1);
$pagination = $settingaTable->getSetting('pagination');
$dbVersion = (new Setting())->get('dbVersion');

生成的文件

实体

此文件是为您创建的,以添加您可能想要为该表添加的任何自定义内容。在用户表中,这可能是一个将全名格式化为某种疯狂标准的函数。因此,此文件永远不会被构建器替换。因此,请用它来完成您所需的工作,并放心代码不会消失。

EntityAbstract

这是基本的实体文件。如果Builder的新版本可能会用修复/功能等替换它,请勿编辑此文件,您的更改将会丢失!

数据表

基本上这是一个表网关,它执行数据库操作并返回实体。再次,Builder会检查这个版本,并会替换为更新的版本。请不要编辑。

需求:运行时

模块和目录(只有当你想要写入文件时)

传递给管理器的命名空间需要是一个存在的模块。它还需要在src/{ModuleName}/directory中有Entity和Model目录

这两个目录需要可以被你的Web服务器写入

例如:

$buildManager = new BuilderManager(‘DBLayer');

将尝试在以下位置创建文件:

module/DBLayer/src/DBLayer/Entity

module/DBLayer/src/DBLayer/Model

全局适配器

Builder使用了全局适配器功能

(在我看来)设置它的最简单方法是修改创建数据对象的模块中的Module.php文件。

module/DBLayer/Module.php

public function onBootstrap(MvcEvent $e) {
...
  $adapter = $e->getApplication()
    ->getServiceManager()
    ->get('Laminas\Db\Adapter\Adapter');

  \Laminas\Db\TableGateway\Feature\GlobalAdapterFeature::setStaticAdapter($adapter);
...
}

确保这个模块在列表中位于使用DBLayer的任何其他模块之前。

提示

写入权限错误

尝试以下shell命令(将DBLayer替换为你的数据模块)

sudo chmod -R a+rwX module/DBLayer/src/{Entity,Model}

控制台快捷方式

  • builder build -w # 这为所有表创建所有文件
  • builder build ALL logs -w # 为日志表构建所有文件
  • builder build datatable ALL -w # 为所有表构建datatable文件

反馈

嘿,如果你有任何想法或建议可以帮助改进这个生成器,请告诉我。请通过电子邮件发送给我 code@cathedral.co.za