lastdragon-ru /lara-asp-serializer
Laravel 的出色包集合 - 序列化器。
6.4.2
2024-09-20 13:09 UTC
Requires
- php: ^8.1|^8.2|^8.3
- illuminate/container: ^10.34.0|^11.0.0
- illuminate/contracts: ^10.34.0|^11.0.0
- illuminate/database: ^10.34.0|^11.0.0
- illuminate/support: ^10.34.0|^11.0.0
- lastdragon-ru/lara-asp-core: 6.4.2
- phpdocumentor/type-resolver: ^1.7
- phpstan/phpdoc-parser: ^1.25
- symfony/deprecation-contracts: ^3.0.0
- symfony/polyfill-php83: ^1.28
- symfony/property-access: ^6.3.0|^7.0.0
- symfony/property-info: ^6.3.9|^7.0.0
- symfony/serializer: ^6.3.3|^7.0.0
Requires (Dev)
- lastdragon-ru/lara-asp-testing: 6.4.2
- mockery/mockery: ^1.6.2
- orchestra/testbench: ^8.0.0|^9.0.0
- phpunit/phpunit: ^10.1.0|^11.0.0
README
此包提供了一个自定义包装器,围绕使用它来在 Laravel 应用程序中使用的 Symfony 序列化组件。
要求
安装
composer require lastdragon-ru/lara-asp-serializer
使用
<?php declare(strict_types = 1); // phpcs:disable PSR1.Files.SideEffects // phpcs:disable PSR1.Classes.ClassDeclaration namespace LastDragon_ru\LaraASP\Serializer\Docs\Examples\Usage; use DateTimeInterface; use Illuminate\Support\Facades\Date; use LastDragon_ru\LaraASP\Dev\App\Example; use LastDragon_ru\LaraASP\Serializer\Contracts\Serializable; use LastDragon_ru\LaraASP\Serializer\Contracts\Serializer; class User implements Serializable { public function __construct( public int $id, public string $name, public DateTimeInterface $created, ) { // empty } } $user = new User(1, 'User', Date::parse('2023-08-27T08:30:44.473+00:00')); $serializer = app()->make(Serializer::class); $serialized = $serializer->serialize($user); $deserialized = $serializer->deserialize(User::class, $serialized); Example::dump($serialized); Example::dump($deserialized);
序列化后的 $serialized 是
"{"id":1,"name":"User","created":"2023-08-27T08:30:44.473+00:00"}"
反序列化后的 $deserialized 是
LastDragon_ru\LaraASP\Serializer\Docs\Examples\Usage\User {
+id: 1
+name: "User"
+created: Illuminate\Support\Carbon {
+"date": "2023-08-27 08:30:44.473000"
+"timezone_type": 1
+"timezone": "+00:00"
}
}
部分反序列化
有时你不知道(或不想支持)对象的完整结构。在这种情况下,你可以将类标记为 Partial
,以允许只反序列化已知(所需)属性
<?php declare(strict_types = 1); // phpcs:disable PSR1.Files.SideEffects // phpcs:disable PSR1.Classes.ClassDeclaration namespace LastDragon_ru\LaraASP\Serializer\Docs\Examples\Partial; use LastDragon_ru\LaraASP\Dev\App\Example; use LastDragon_ru\LaraASP\Serializer\Contracts\Partial; use LastDragon_ru\LaraASP\Serializer\Contracts\Serializable; use LastDragon_ru\LaraASP\Serializer\Contracts\Serializer; class User implements Serializable, Partial { public function __construct( public string $name, ) { // empty } } $serializer = app()->make(Serializer::class); $deserialized = $serializer->deserialize(User::class, '{"id":1,"name":"User"}'); Example::dump($deserialized);
反序列化后的 $deserialized 是
LastDragon_ru\LaraASP\Serializer\Docs\Examples\Partial\User {
+name: "User"
}
扩展
默认情况下,该包只支持以下对象(有关更多详细信息,请参阅 Factory
)
- 任何实现
Serializable
的对象(请参阅SerializableNormalizer
) - 任何实现
\DateTimeInterface
的对象(请参阅DateTimeNormalizer
) \DateTimeZone
\DateInterval
- PHP 枚举
发布配置并添加正常化器/反正常化器,如果您需要更多
php artisan vendor:publish --provider=LastDragon_ru\\LaraASP\\Serializer\\Provider --tag=config
Eloquent 访问器/突变器1
您可以使用 Serialized
属性将模型属性从对象中填充
<?php declare(strict_types = 1); // phpcs:disable PSR1.Files.SideEffects // phpcs:disable PSR1.Classes.ClassDeclaration namespace LastDragon_ru\LaraASP\Serializer\Docs\Examples\Attribute; use Illuminate\Database\Eloquent\Casts\Attribute; use Illuminate\Database\Eloquent\Model; use LastDragon_ru\LaraASP\Dev\App\Example; use LastDragon_ru\LaraASP\Serializer\Casts\Serialized; use LastDragon_ru\LaraASP\Serializer\Contracts\Serializable; class UserSettings implements Serializable { public function __construct( public int $perPage, public bool $showSidebar, ) { // empty } } class User extends Model { /** * @return Attribute<?UserSettings, ?UserSettings> */ protected function settings(): Attribute { return app()->make(Serialized::class)->attribute(UserSettings::class); } } $user = new User(); $user->settings = new UserSettings(35, false); Example::dump($user->settings); Example::dump($user->getAttributes());
$user->settings 是
LastDragon_ru\LaraASP\Serializer\Docs\Examples\Attribute\UserSettings {
+perPage: 35
+showSidebar: false
}
$user->getAttributes() 是
[
"settings" => "{"perPage":35,"showSidebar":false}",
]
升级
请遵循 升级指南。