This package provides a customizable wrapper around the Symfony Serializer Component to use it inside Laravel application.
Requirement | Constraint | Supported by |
---|---|---|
PHP | ^8.3 |
HEAD ⋯ 5.0.0 |
^8.2 |
HEAD ⋯ 5.0.0-beta.0 |
|
^8.1 |
6.4.1 ⋯ 5.0.0-beta.0 |
|
Laravel | ^11.0.0 |
HEAD ⋯ 6.2.0 |
^10.34.0 |
HEAD ⋯ 6.2.0 |
|
^10.0.0 |
6.1.0 ⋯ 5.0.0-beta.0 |
|
^9.21.0 |
5.6.0 ⋯ 5.0.0-beta.1 |
|
^9.0.0 |
5.0.0-beta.0 |
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);
The $serialized
is:
"{"id":1,"name":"User","created":"2023-08-27T08:30:44.473+00:00"}"
The $deserialized
is:
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"
}
}
Sometimes you don't know (or do not want to support) the full structure of the object. In this case you can mark the class as \LastDragon_ru\LaraASP\Serializer\Contracts\Partial
to allow unserialize only known (wanted) properties:
<?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);
The $deserialized
is:
LastDragon_ru\LaraASP\Serializer\Docs\Examples\Partial\User {
+name: "User"
}
Out of the box, the package supports only the following objects (see Factory
for more details):
- Any object that implement
Serializable
(seeSerializableNormalizer
) - Any object that implement
\DateTimeInterface
(seeDateTimeNormalizer
) \DateTimeZone
\DateInterval
- PHP Enums
Publish the config and add normalizers/denormalizers if you need more:
php artisan vendor:publish --provider=LastDragon_ru\\LaraASP\\Serializer\\Provider --tag=config
Eloquent Accessor/Mutator1
You can use the LastDragon_ru\LaraASP\Serializer\Casts\Serialized
attribute to populate a model attribute to/from an object:
<?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());
The $user->settings
is:
LastDragon_ru\LaraASP\Serializer\Docs\Examples\Attribute\UserSettings {
+perPage: 35
+showSidebar: false
}
The $user->getAttributes()
is:
[
"settings" => "{"perPage":35,"showSidebar":false}",
]
Please follow Upgrade Guide.
This package is the part of Awesome Set of Packages for Laravel. Please use the main repository to report issues, send pull requests, or ask questions.