openpsa/midgard-portable

基于Doctrine 2构建的ActiveRecord ORM

v1.10.0 2023-07-06 19:33 UTC

README

这个库提供了一个基于Doctrine 2构建的ActiveRecord ORM,并模仿了Midgard API。

简而言之

您可以使用XML(通常称为MgdSchema)定义您的实体

<type name="my_person" table="person">
    <property name="id" type="unsigned integer" primaryfield="id">
        <description>Local database identifier</description>
    </property>
    <property name="firstname" type="string" index="yes">
        <description>First name of the person</description>
    </property>
    <property name="lastname" type="string" index="yes">
        <description>Last name of the person</description>
    </property>
</type>

运行midgard-portable schema将会创建相应的数据库表和一个PHP类(通常称为MgdSchema类)。您可以使用它来读取和写入数据库

// create a new person
$person = new my_person();
$person->firstname = 'Alice';
if ($person->create()) {
    echo 'Created person #' . $person->id;
}
// load a new copy of the same person
$loaded = new my_person($person->id);
$loaded->firstname = 'Bob';
if ($loaded->update()) {
    echo 'Renamed from ' . $person->firstname . ' to ' . $loaded->firstname;
}

midgard-portable会自动向记录添加元数据

$person = new my_person();
$person->firstname = 'Alice';
$person->create();
sleep(1);
$person->lastname = 'Cooper';
$person->update();
echo 'Person was created on ' . $person->metadata->created->format('Y-m-d H:i:s');
echo  ' and last updated on ' . $person->metadata->updated->format('Y-m-d H:i:s');

它也支持软删除

$person = new my_person();
$person->firstname = 'Alice';
$person->create();
$person->delete();
try {
    $loaded = new my_person($person->id);
} catch (midgard_error_exception $e) {
    echo $e->getMessage(); // prints "Object does not exist."
}
// Revert the deletion
my_person::undelete($person->guid);
// or remove the entry completely
$person->purge();

您可以通过以下方式查询条目

$qb = new midgard_query_builder('my_person');
$qb->add_constraint('metadata.created', '>', '2012-12-10 10:00:00');
$qb->add_order('firstname');
foreach ($qb->execute() as $result) {
    echo $result->lastname . "\n";
}

或者,您可以直接使用Doctrine的内置QueryBuilder

然后,还有对象树、链接、文件处理、数据导入/导出等很多功能,但直到有时间来记录所有这些,您可能需要阅读源代码来了解(单元测试也可能是一个好的起点)。

使用方法

要将midgard-portable包含到您的应用程序中,只需在您的composer.jsonrequire它。您可以像这样启动适配器

<?php
use midgard\portable\driver;
use midgard\portable\storage\connection;

$db_config = [
    'driver' => 'pdo_sqlite',
    'memory' => true
];
$schema_dirs = ['/path/to/my/schemas/'];
$var_dir = '/path/to/vardir';
$entity_namespace = '';
$dev_mode = false;

$driver = new driver($schema_dirs, $var_dir, $entity_namespace);
connection::initialize($driver, $db_config, $dev_mode);

根据需要更改参数。在调用connection::initialize()之后,您可以通过Midgard API以概述的方式与数据库进行交互。

CLI工具

midgard-portable需要生成实体类以及为Doctrine生成ClassMetadataProxy类。在开发环境中,这会在每个请求上自动完成。对于生产安装,您可以使用以下CLI命令

./bin/vendor/midgard-portable schema

它的工作方式与旧版的midgard-schema工具非常相似,即它会根据MgdSchema XML文件、相关的映射数据以及代理类生成midgard_object类,并创建/更新相应的数据库表。您在初始安装期间需要运行此命令一次,每次MgdSchemas更改时也需要再次运行。

如果您创建一个名为cli-config.php的文件,并包含以下内容,您也可以使用Doctrine的CLI运行器和它提供的一切功能

<?php
use midgard\portable\storage\connection;
require 'my_settings_file.php'; //This needs to contain the code shown above
$entityManager = connection::get_em();