zolex / vom
多用途对象映射器。使用 PHP 属性将任意数据映射到严格类型的模型。
Requires
- php: >=8.1
- phpdocumentor/reflection-docblock: ^5.2
- symfony/property-access: ^6.2|^7.0
- symfony/serializer: ^6.4|^7.0
Requires (Dev)
- doctrine/orm: ^3.0
- symfony/framework-bundle: ^6.1|^7.0
- symfony/yaml: ^6.1|^7.0
README
多用途对象映射器(简称 VOM)是一个 PHP 库,通过简单地给模型类添加 PHP 属性,将任何数据结构转换为严格类型的模型。
安装
VOM 可在 Packagist 上找到。要安装,只需通过 Composer 引入即可。
composer require zolex/vom ^0.4
纯 PHP
通过 composer 安装或从发布页面下载,您即可开始使用 不带框架的 VOM。
Symfony
当使用 symfony 时,该包也作为扩展集成。使用 flex 和自动配置,无需进行其他操作。您可以使用 VOM Symfony 服务。为了最佳互操作性,VOM 实现了 Symfony 正常化器和反正常化器接口。
无自动配置或选择不运行 symfony/flex 脚本生成,您必须手动将扩展添加到 config/bundles.php
以启用它。
<?php return [ // ... Zolex\VOM\Symfony\Bundle\ZolexVOMBundle::class => ['all' => true], // ... ];
Laravel
VOM 还附带 Laravel 服务提供者。安装后,将 VersatileObjectMapper
类注册为依赖注入,并且可以使用 app()
、resolve()
等方式访问。有关 Laravel 中的 VOM 的示例,请参阅示例。
快速入门
为了让您对 VOM 的基本功能有一个基本的了解,这里有一个简单的例子。
假设,您的应用程序从某处接收以下扁平数组值。
$data = [ 'firstname' => 'Jane', 'surname' => 'Doe', 'street' => 'Samplestreet 123', 'city' => 'Worsthausen', 'zip' => '12345', 'country_name' => 'United Kingdom', 'email_address' => 'jane.doe@coxautoinc.com', 'phone' => '0123456789' ];
通常,您会编写一些代码来创建模型实例,设置它们的属性并适当地嵌套它们。在非常简单的场景中,将转换逻辑作为代码编写可能是一个不错的选择,但面对非常大的模型、输入数据结构或应用模型在开发过程中发生变化,或者您想在其他项目中重用转换逻辑时,这可能会变得很痛苦,因为它们接收相同的输入和/或使用相同的模型。
如何使用 VOM 实现
与编写为模型提供数据的业务逻辑不同,您只需使用 PHP 属性配置模型。
use Zolex\VOM\Mapping as VOM; #[VOM\Model] class Person { #[VOM\Property] public string $firstname; #[VOM\Property('[surname]')] public string $lastname; #[VOM\Property(accessor: false)] public Address $address; #[VOM\Property(accessor: false)] public Contact $contact; } #[VOM\Model] class Address { #[VOM\Property] public string $street; #[VOM\Property('[zip]')] public string $zipCode; #[VOM\Property] public string $city; #[VOM\Property('[country_name]')] public string $country; } #[VOM\Model] class Contact { #[VOM\Property('[email_address]')] public string $email; #[VOM\Property] public string $phone; }
要创建模型实例,只需将数据传递给 denormalize()
方法。
$person = $objectMapper->denormalize($data, Person::class);
您可能已经注意到,某些属性具有参数,而其他属性则没有。有关所有细节,请参阅 完整文档。
现在我需要这个吗?
如果您的输入数据和应用程序模型的数据结构之间有任何差异,VOM 可能是一个不错的选择,以避免编写和维护代码,而是只需添加一些 PHP 属性。
注意
如果您需要向实体注入数据,而这些数据已经与您的模型结构匹配,则可以使用此库,但可能有些冗余。在这种情况下,您可以直接利用标准的 Symfony 正常化器。
文档
完整的文档可以在本仓库的docs文件夹中找到。点击此处查看文档。
示例
快速入门示例以及其他示例可以在VOM Examples 仓库中找到。