大教堂 / 构建者
数据库层构建库,具有基本Web和控制台界面
Requires
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后
- 将
./vendor/cathedral/builder/config/cathedral-builder.global.php.dist
复制到./config/autoload/cathedral-builder.global.php.php
- 按需更改设置。
- namespace - 文件将被创建的模块以及创建文件的命名空间。默认为
Application
。 - entity_singular - 此功能的开启/关闭开关。
- singular_ignore - 为实体单数设置的表列表,使用 |(管道符)分隔。
- namespace - 文件将被创建的模块以及创建文件的命名空间。默认为
构建您的数据层
构建者仅用于生成类,之后类只依赖于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