spiral / 打包器
打包器包
v1.0.0
2023-07-31 12:06 UTC
Requires
- php: >=8.1
- google/protobuf: ^3.23
- nesbot/carbon: ^2.68.0
- spiral/attributes: ^2.8 || ^3.0
Requires (Dev)
- jetbrains/phpstorm-attributes: dev-master@dev
- phpunit/phpunit: ^10.2
- ramsey/uuid: ^4.7
- roave/security-advisories: dev-latest
- vimeo/psalm: ^5.13
README
简介
打包器包是一个PHP工具,可以帮助您将PHP对象转换为简单的数组,反之亦然。它允许您将对象打包为数组表示形式以进行序列化、存储和传输,并将数组还原回对象。
此包提供易于使用的将对象转换为数组并从数组恢复对象的函数。它支持处理嵌套对象和复杂的数据结构。
要求
请确保您的服务器已配置以下PHP版本和扩展
- PHP 8.1+
安装
您可以通过composer安装此包
composer require spiral/marshaller
用法
注意 在这里,将介绍包的底层使用方法。 打包器桥接器 是Spiral框架的现成集成。
将对象转换为数组
例如,我们有一个具有简单字符串属性、地址属性、状态枚举、UUID和地址对象数组的User类,我们需要对其进行序列化
User
namespace App\Entity; use Ramsey\Uuid\UuidInterface; use Spiral\Marshaller\Meta\Marshal; use Spiral\Marshaller\Meta\MarshalArray; use Spiral\Marshaller\Type\EnumType; class User { public function __construct( #[Marshal] private UuidInterface $uuid, #[Marshal(name: 'first_name')] private string $firstName, #[Marshal(name: 'last_name')] private string $lastName, #[Marshal(of: Status::class, type: EnumType::class)] private Status $status, #[Marshal(of: Address::class)] private Address $address, #[Marshal(name: 'registered_at', of: \DateTimeImmutable::class)] private \DateTimeImmutable $registeredAt, #[MarshalArray(name: 'delivery_addresses', of: Address::class)] private array $deliveryAddresses ) { } }
使用属性,我们指定哪些私有和受保护的属性需要序列化,并配置额外的打包器参数(例如,应该是什么类型的数组元素)。
注意 对于公共属性,指定
Marshal
属性是可选的,除非该属性需要额外的打包器配置。
Address
namespace App\Entity; use Spiral\Marshaller\Meta\Marshal; final class Address { public function __construct( #[Marshal] private string $street, #[Marshal] private string $city, #[Marshal] private string $country ) { } }
Status
namespace App\Entity; enum Status: string { case Active = 'active'; case Inactive = 'inactive'; }
要序列化User对象,我们需要创建一个Marshaller
对象,并调用marshal
方法,并将User对象传递给它。
use App\Entity\Address; use App\Entity\Status; use App\Entity\User; use Ramsey\Uuid\Uuid; use Spiral\Attributes\AttributeReader; use Spiral\Marshaller\Mapper\AttributeMapperFactory; use Spiral\Marshaller\Marshaller; $address = new Address( street: 'Washington St.', city: 'San Francisco', country: 'USA', ); $deliveryAddresses = [ new Address( street: 'Street 1', city: 'New York', country: 'USA', ), new Address( street: 'Street 2', city: 'Chicago', country: 'USA', ) ]; $user = new User( uuid: Uuid::uuid4(), firstName: 'John', lastName: 'Doe', status: Status::Active, address: $address, registeredAt: new \DateTimeImmutable(), deliveryAddresses: $deliveryAddresses, ); $marshaller = new Marshaller(new AttributeMapperFactory(new AttributeReader())); $data = $marshaller->marshal($user); // result: array(7) { 'uuid' => string(36) "e9aa20f8-8425-4020-af63-4a88725286c4" 'first_name' => string(4) "John" 'last_name' => string(3) "Doe" 'status' => array(2) { 'name' => string(6) "Active" 'value' => string(6) "active" } 'address' => array(3) { 'street' => string(14) "Washington St." 'city' => string(13) "San Francisco" 'country' => string(3) "USA" } 'registered_at' => string(25) "2023-07-16T13:57:35+00:00" 'delivery_addresses' => array(2) { [0] => array(3) { 'street' => string(8) "Street 1" 'city' => string(8) "New York" 'country' => string(3) "USA" } [1] => array(3) { 'street' => string(8) "Street 2" 'city' => string(7) "Chicago" 'country' => string(3) "USA" } } }
将数组转换为对象
要反序列化数组,我们需要创建一个Marshaller
对象,并调用unmarshal
方法,并将包含数据和要填充的对象的数组传递给它。
use Spiral\Attributes\AttributeReader; use Spiral\Marshaller\Mapper\AttributeMapperFactory; use Spiral\Marshaller\Marshaller; $marshaller = new Marshaller(new AttributeMapperFactory(new AttributeReader())); $data = [ 'uuid' => '4730d422-19ec-4da8-a3be-d42a774e0f2f', 'first_name' => 'John', 'last_name' => 'Doe', 'status' => [ 'name' => 'Active', 'value' => 'active' ], 'address' => [ 'street' => 'Washington St.', 'city' => 'San Francisco', 'country' => 'USA', ], 'registered_at' => '2023-07-16T13:23:04+00:00', 'delivery_addresses' => [ [ 'street' => 'Street 1', 'city' => 'New York', 'country' => 'USA', ], [ 'street' => 'Street 2', 'city' => 'Chicago', 'country' => 'USA', ] ], ]; $user = $marshaller->unmarshal( $data, (new \ReflectionClass(User::class))->newInstanceWithoutConstructor() ); // result: class App\Entity\User#453 (7) { private Ramsey\Uuid\UuidInterface $uuid => class Ramsey\Uuid\Lazy\LazyUuidFromString#421 (2) { private ?Ramsey\Uuid\UuidInterface $unwrapped => NULL private string $uuid => string(36) "4730d422-19ec-4da8-a3be-d42a774e0f2f" } private string $firstName => string(4) "John" private string $lastName => string(3) "Doe" private App\Entity\Status $status => enum App\Entity\Status::Active : string("active"); private App\Entity\Address $address => class App\Entity\Address#447 (3) { private string $street => string(14) "Washington St." private string $city => string(13) "San Francisco" private string $country => string(3) "USA" } private DateTimeImmutable $registeredAt => class DateTimeImmutable#412 (3) { public $date => string(26) "2023-07-16 13:23:04.000000" public $timezone_type => int(1) public $timezone => string(6) "+00:00" } private array $deliveryAddresses => array(2) { [0] => class App\Entity\Address#392 (3) { private string $street => string(8) "Street 1" private string $city => string(8) "New York" private string $country => string(3) "USA" } [1] => class App\Entity\Address#443 (3) { private string $street => string(8) "Street 2" private string $city => string(7) "Chicago" private string $country => string(3) "USA" } } }
测试
composer test
变更日志
请参阅变更日志以获取有关最近更改的更多信息。
贡献
请参阅贡献指南以获取详细信息。
安全漏洞
请审查我们的安全策略以了解如何报告安全漏洞。
许可
MIT许可(MIT)。请参阅许可文件以获取更多信息。