falseclock / dbd-php-entity
类似于DTO的库,以面向对象的方式(ORM)获取任何数据
Requires
- php: ^8.2
- ext-json: *
- myclabs/php-enum: ^1.8.4
Requires (Dev)
- php-coveralls/php-coveralls: ^v2.7.0
- phpunit/phpunit: ^11.2.8
README
注意: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
目录
主要类
字段说明
辅助类
辅助类
映射器
任何模型描述都是从继承此抽象类开始的。子类必须遵守几个简单规则
- 所有类型为
Column的变量都声明为public。 - 除了
Column之外的所有变量都声明为protected。 - 类不应包含
private变量。 - 类不应有方法。
- 常量
ANNOTATION应被重写。 - 类的名称应与主要类
Entity同名,并带有后缀Map。 Entity和Mapper类应位于同一namespace中。
示例
class City extends Entity { } class CityMap extends Mapper { const ANNOTATION = "Data description"; }
后缀Map可以通过常量Maper::POSTFIX重写
Mapper类的所有子类都是单例,并且通过静态方法me调用。
公共方法
- __get
- findColumnByOriginName
- getAllVariables
- getAnnotation
- getColumns
- getComplex
- getConstraints
- getEmbedded
- getEntityClass
- getOriginFieldNames
- getPrimaryKey
- getTable
- getVarNameByColumn
- me
- meWithoutEnforcer
- name
__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中声明Entity和Mapper,则应谨慎使用此功能。
getOriginFieldNames
getOriginFieldNames — 获取声明的public字段数组
说明
public getOriginFieldNames(): array
此函数返回一个关联数组,其中键是Mapper类变量的名称,值是字段名称。

