falseclock/dbd-php-entity

类似于DTO的库,以面向对象的方式(ORM)获取任何数据

3.1.6 2024-09-18 19:09 UTC

README

scrutinizer build Coverage Status PHP Version Require

Latest Stable Version Total Downloads Latest Unstable Version License

注意:readme正在编写中。

该库允许轻松地将关联数组转换为对象,按预先定义的结构(映射)进行转换,换句话说,实现了DTO。最初该项目是一个ORM库,但并不局限于这一点。使用该库可以描述任何结构化数据,而不仅仅是表及其字段。

操作原理

假设您有一个包含多个字段的表

test=# select currency_id, currency_name, currency_short_name, currency_symbol,currency_code FROM currencies;
 currency_id |    currency_name    | currency_short_name | currency_symbol | currency_code
-------------+---------------------+---------------------+-----------------+---------------
         505 | Доллар США          | Доллар              | $               | USD
          36 | Казахстанский Тенге | Тенге               | ₸               | KZT
         506 | Российский Рубль    | Рубль               | ₽               | RUB
         548 | Евро                | Евро                | €               | EUR
(4 строки)

通过某种PDO从该表中提取数据,并得到一个命名数组。

要访问元素,您必须明确提供字段名称

$item['currency_name'];
$item['currency_symbol'];

如果事先创建映射,则我们可以从命名数组获得对象

$objects = [];
foreach ($array as $item) {
    $objects[] = new Currency($item);
}
// обращаться к значениям теперь можно так: 
$objects[0]->name;
$objects[0]->symbol;

这使我们能够不依赖于字段名称。这个库只适用于表格数据吗?不。您可以描述任何结构,例如YAML文件或简单的JSON数据。需要嵌套结构?需要getter和setter?需要数据预转换?这些都有,甚至更多。您可以控制数据的完整性、结构的嵌套、隐藏字段,如果要将它们提供给外部环境,以及更多。这有助于您的项目吗?那么,请继续安装。

安装

composer require falseclock/dbd-php-entity

目录

主要类

字段说明

辅助类

辅助类

映射器

任何模型描述都是从继承此抽象类开始的。子类必须遵守几个简单规则

  1. 所有类型为Column的变量都声明为public
  2. 除了Column之外的所有变量都声明为protected
  3. 类不应包含private变量。
  4. 类不应有方法。
  5. 常量ANNOTATION应被重写。
  6. 类的名称应与主要类Entity同名,并带有后缀Map
  7. EntityMapper类应位于同一namespace中。

示例

class City extends Entity {

}

class CityMap extends Mapper
{
    const ANNOTATION = "Data description";
}

后缀Map可以通过常量Maper::POSTFIX重写

Mapper类的所有子类都是单例,并且通过静态方法me调用。

公共方法

__get

__get — 用于访问类的protected变量的魔术方法。

说明

public __get(string $property): mixed

在某些情况下,如果需要在IDE中访问非公开变量,可以在类标题的phpdoc中通过@property指定变量,该变量可通过魔术方法访问。如果访问不存在的变量,将抛出异常。

示例

/**
 * Class MapperGet
 * @property Embedded $Regions
 * @property Complex $Address
 */
class MapperGet extends Mapper
{
    const ANNOTATION = "Data description";

    /** @var Embedded */
    protected $Regions = [
        Embedded::NAME => "country_regions",
        Embedded::ENTITY_CLASS => Region::class,
    ];

    /**  @var Complex */
    protected $Address = [
        Complex::TYPE => Address::class,
    ];
}

findColumnByOriginName

findColumnByOriginName — 通过关联数组键获取Column类实例。

说明

public findColumnByOriginName(string $originName): Column

当需要获取在Mapper类中如何描述某个public字段的信息时,可以使用此功能。

getAllVariables

getAllVariables — 获取类中所有定义的变量

说明

public getAllVariables(): MapperVariables

这是一个有用的函数,如果需要根据字段描述来生成关系数据库中表的创建脚本。

getAnnotation

getAnnotation — 获取ANNOTATION常量

说明

public getAnnotation(): string

getColumns

getColumns — 获取标准字段数组

说明

public getColumns(): array

此函数返回在Mapper类中定义的Columns数组。请注意,复杂字段被声明为public

getComplex

getComplex — 获取复杂字段数组

说明

public getComplex(): array

此函数返回在Mapper类中定义的Complex数组。请注意,复杂字段被声明为protected

getConstraints

getConstraints — 获取限制条件数组

说明

public getConstraints(): array

此函数返回在Mapper类中定义的Constraint数组。请注意,限制条件被声明为protected

getEmbedded

getEmbedded — 获取内置字段数组

说明

public getEmbedded(): array

此函数返回在Mapper类中定义的Embedded数组。请注意,内置字段被声明为protected

getEntityClass

getEntityClass — 获取使用该映射的类

说明

public getEntityClass(): string

如果未在同一个namespace中声明EntityMapper,则应谨慎使用此功能。

getOriginFieldNames

getOriginFieldNames — 获取声明的public字段数组

说明

public getOriginFieldNames(): array

此函数返回一个关联数组,其中键是Mapper类变量的名称,值是字段名称。