1. Go to this page and download the library: Download crell/serde library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
crell / serde example snippets
use Crell\Serde\SerdeCommon;
$serde = new SerdeCommon();
$object = new SomeClass();
// Populate $object somehow;
$jsonString = $serde->serialize($object, format: 'json');
$deserializedObject = $serde->deserialize($jsonString, from: 'json', to: SomeClass::class);
use Crell\Serde\Attributes as Serde;
#[Serde\ClassSettings(
protected string $name = 'Larry';
}
use Crell\Serde\Attributes\Field;
class Person
{
#[Field(serializedName: 'callme')]
protected string $name = 'Larry';
}
use Crell\Serde\Attributes\Field;
use Crell\Serde\Renaming\Cases;
class Person
{
#[Field(renameWith: Cases::snake_case)]
public string $firstName = 'Larry';
#[Field(renameWith: Cases::CamelCase)]
public string $lastName = 'Garfield';
}
use Crell\Serde\Attributes\Field;
use Crell\Serde\Renaming\Prefix;
class MailConfig
{
#[Field(renameWith: new Prefix('mail_')]
protected string $host = 'smtp.example.com';
#[Field(renameWith: new Prefix('mail_')]
protected int $port = 25;
#[Field(renameWith: new Prefix('mail_')]
protected string $user = 'me';
#[Field(renameWith: new Prefix('mail_')]
protected string $password = 'sssh';
}
use Crell\Serde\Attributes\Field;
class Person
{
#[Field(alias: ['layout', 'design'])]
protected string $format = '';
}
use Crell\Serde\Attributes\Field;
class Person
{
#[Field(default: 'Hidden')]
public string $location;
#[Field(useDefault: false)]
public int $age;
public function __construct(
public string $name = 'Anonymous',
) {}
}
use Crell\Serde\Attributes as Serde;
class Results
{
public function __construct(
#[Serde\Field(flatten: true)]
public Pagination $pagination,
#[Serde\SequenceField(arrayType: Product::class)]
public array $products,
) {}
}
class Pagination
{
public function __construct(
public int $total,
public int $offset,
public int $limit,
) {}
}
class Product
{
public function __construct(
public string $name,
public float $price,
) {}
}
use Crell\Serde\Attributes as Serde;
class DetailedResults
{
public function __construct(
#[Serde\Field(flatten: true)]
public NestedPagination $pagination,
#[Serde\Field(flatten: true)]
public ProductType $type,
#[Serde\SequenceField(arrayType: Product::class)]
public array $products,
#[Serde\Field(flatten: true)]
public array $other = [],
) {}
}
class NestedPagination
{
public function __construct(
public int $total,
public int $limit,
#[Serde\Field(flatten: true)]
public PaginationState $state,
) {}
}
class PaginationState
{
public function __construct(
public int $offset,
) {
}
}
class ProductType
{
public function __construct(
public string $name = '',
public string $category = '',
) {}
}
class Person
{
public function __construct(
public string $name,
#[Field(flatten: true)]
public Age $age,
#[Field(flatten: true)]
public Email $email,
) {}
}
readonly class Email
{
public function __construct(
#[Field(serializedName: 'email')] public string $value,
) {}
}
readonly class Age
{
public function __construct(
#[Field(serializedName: 'age')] public int $value
) {
$this->validate();
}
#[PostLoad]
private function validate(): void
{
if ($this->value < 0) {
throw new \InvalidArgumentException('Age cannot be negative.');
}
}
}
readonly class JobDescription
{
public function __construct(
#[Field(flatten: true, flattenPrefix: 'min_')]
public Age $minAge,
#[Field(flatten: true, flattenPrefix: 'max_')]
public Age $maxAge,
) {}
}
class JobEntry
{
public function __construct(
#[Field(flatten: true, flattenPrefix: 'desc_')]
public JobDescription $description,
) {}
}
use Crell\Serde\Attributes\SequenceField;
class Order
{
public string $orderId;
public int $userId;
#[SequenceField(arrayType: Product::class)]
public array $products;
}
use Crell\Serde\Attributes\SequenceField;
class Order
{
#[SequenceField(implodeOn: ',')]
protected array $productIds = [5, 6, 7];
}
use Crell\Serde\Attributes\DateField;
class Settings
{
#[DateField(format: 'Y-m-d')]
protected DateTimeImmutable $date = new DateTimeImmutable('4 July 2022-07-04 14:22);
}
use Crell\Serde\Attributes\UnixTimeField;
use Crell\Serde\Attributes\Enums\UnixTimeResolution;
class Jwt
{
#[UnixTimeField]
protected DateTimeImmutable $exp;
#[UnixTimeField(resolution: UnixTimeResolution::Milliseconds)]
protected DateTimeImmutable $iss;
}
namespace Crell\Serde\Records;
use Crell\Serde\Attributes\SequenceField;
class CsvTable
{
public function __construct(
#[SequenceField(arrayType: CsvRow::class)]
public array $people,
) {}
}
class CsvRow
{
public function __construct(
public string $name,
public int $age,
public float $balance,
) {}
}
// The JsonStreamFormatter and CsvStreamFormatter are not ()]);
// You may use any PHP supported stream here, including files, network sockets,
// stdout, an in-memory temp stream, etc.
$init = FormatterStream::new(fopen('/tmp/output.json', 'wb'));
$result = $serde->serialize($data, format: 'json-stream', init: $init);
// $result is a FormatterStream object that wraps the same handle as before.
// What you can now do with the stream depends on what kind of stream it is.
use Crell\Serde\Attributes\SequenceField;
class ProductList
{
public function __construct(
#[SequenceField(arrayType: Product::class)]
private iterable $products,
) {}
}
class Product
{
public function __construct(
public readonly string $name,
public readonly string $color,
public readonly float $price,
) {}
}
$databaseConn = ...;
$callback = function() use ($databaseConn) {
$result = $databaseConn->query("SELECT name, color, price FROM products ORDER BY name");
// Assuming $record is an associative array.
foreach ($result as $record) {
yield new Product(...$record);
}
};
// This is a lazy list of products, which will be pulled from the database.
$products = new ProductList($callback());
// Use the CSV formatter this time, but JsonStream works just as well.
$s = new SerdeCommon(formatters: [new CsvStreamFormatter()]);
// Write to stdout, aka, back to the browser.
$init = FormatterStream::new(fopen('php://output', 'wb'));
$result = $serde->serialize($products, format: 'csv-stream', init: $init);
use Crell\Serde\Attributes\SequenceField;
interface Product {}
interface Book extends Product {}
class PaperBook implements Book
{
protected string $title;
protected int $pages;
}
class DigitalBook implements Book
{
protected string $title;
protected int $bytes;
}
class Sale
{
protected Book $book;
protected float $discountRate;
}
class Order
{
protected string $orderId;
#[SequenceField(arrayType: Book::class)]
protected array $products;
}
use Crell\Serde\ClassNameTypeMap;
class Sale
{
#[ClassNameTypeMap(key: 'type')]
protected Book $book;
protected float $discountRate;
}
use Crell\Serde\Attributes\StaticTypeMap;
class Sale
{
#[StaticTypeMap(key: 'type', map: [
'paper' => Book::class,
'ebook' => DigitalBook::class,
])]
protected Book $book;
protected float $discountRate;
}
use Crell\Serde\Attributes as Serde;
class Order
{
protected string $orderId;
#[Serde\SequenceField(arrayType: Book::class)]
#[Serde\StaticTypeMap(key: 'type', map: [
'paper' => Book::class,
'ebook' => DigitalBook::class,
])]
protected array $books;
}
use Crell\Serde\Attributes\StaticTypeMap;
#[StaticTypeMap(key: 'type', map: [
'paper' => Book::class,
'ebook' => DigitalBook::class,
])]
interface Book {}
use Crell\Serde\TypeMap;
class ProductTypeMap implements TypeMap
{
public function __construct(protected readonly Connection $db) {}
public function keyField(): string
{
return 'type';
}
public function findClass(string $id): ?string
{
return $this->db->someLookup($id);
}
public function findIdentifier(string $class): ?string
{
return $this->db->someMappingLogic($class);
}
}
$typeMap = new ProductTypeMap($dbConnection);
$serde = new SerdeCommon(typeMaps: [
Your\App\Product::class => $typeMap,
]);
$json = $serde->serialize($aBook, to: 'json');
class User
{
private string $username;
#[Field(exclude: true)]
private string $password;
#[Field(exclude: true)]
#[Field(scope: 'admin')]
private string $role;
}