Skip to content

vjik/cycle-typecast

Repository files navigation

Cycle Typecast

Latest Stable Version Total Downloads Build status Mutation testing badge static analysis psalm-level

The package provides:

  • Typecaster that help typecast data in Cycle ORM and abstract TypecastHandler that used it;
  • AttributeTypecastHandler that use attributes for typecast data;
  • TypeInterface that must be implemented by classes used in Typecaster and AttributeTypecastHandler;
  • classes for DateTimeImmutable, UUID, Array and Enum types.

Installation

The package could be installed with composer:

composer require vjik/cycle-typecast

General Usage

Attributes

use Vjik\CycleTypecast\AttributeTypecastHandler;
use Vjik\CycleTypecast\UuidString\UuidStringToBytesType;
use Vjik\CycleTypecast\DateTimeImmutable\DateTimeImmutableToIntegerType;

#[Entity(
    // ...
    typecast: AttributeTypecastHandler::class,
)]
final class User
{
    // ...

    #[Column(type: 'primary', primary: true)]
    #[UuidStringToBytesType]
    private string $id;

    #[Column(type: 'int')]
    #[DateTimeImmutableToIntegerType]
    private DateTimeImmutable $createDate;

Custom Typecast Handler

use Vjik\CycleTypecast\ArrayToStringType;
use Vjik\CycleTypecast\DateTimeImmutable\DateTimeImmutableToIntegerType;
use Vjik\CycleTypecast\TypecastHandler;
use Vjik\CycleTypecast\UuidString\UuidStringToBytesType;

final class UserTypecastHandler extends Vjik\CycleTypecast\TypecastHandler
{
    protected function getConfig(): array
    {
        return [
            'id' => new UuidStringToBytesType(),
            'createDate' => new DateTimeImmutableToIntegerType(),
            'modifyDate' => new DateTimeImmutableToIntegerType(),
            'tags' => new ArrayToStringType(','),
        ];
    }
}

Custom Mapper

use Cycle\ORM\ORMInterface;
use Cycle\ORM\PromiseMapper\PromiseMapper;
use Vjik\CycleTypecast\Typecaster;
use Vjik\CycleTypecast\ArrayToStringType;
use Vjik\CycleTypecast\DateTimeImmutable\DateTimeImmutableToIntegerType;
use Vjik\CycleTypecast\UuidString\UuidStringToBytesType;

final class UserMapper extends PromiseMapper
{
    private Typecaster $typecaster;

    public function __construct(ORMInterface $orm, string $role)
    {
        // Typecast configuration
        $this->typecaster = new Typecaster([
            'id' => new UuidStringToBytesType(),
            'createDate' => new DateTimeImmutableToIntegerType(),
            'modifyDate' => new DateTimeImmutableToIntegerType(),
            'tags' => new ArrayToStringType(','),
        ]);
        
        parent::__construct($orm, $role);
    }

    public function extract($entity): array
    {
        $data = parent::extract($entity);
        
        // Typecast after extract from entity
        return $this->typecaster->prepareAfterExtract($data);
    }

    public function hydrate($entity, array $data)
    {
        // Typecast before hydrate entity
        $data = $this->typecaster->prepareBeforeHydrate($data);
        
        return parent::hydrate($entity, $data);
    }
}

Types

ArrayToStringType

new ArrayToStringType(',');

Entity value: array of strings. For example, ['A', 'B', 'C'].

Database value: array concatenated into string with delimiter setted in constructor. For example, A,B,C.

DateTimeImmutableToIntegerType

new DateTimeImmutableToIntegerType();

Entity value: DateTimeImmutable.

Database value: timestamp as string (example, 1609658768).

IntegerEnumType

new IntegerEnumType(IntegerEnum::class);

Entity value: integer typed enumeration.

Database value: enumeration value of integer type.

StringEnumType

new StringEnumType(StringEnum::class);

Entity value: string typed enumeration.

Database value: enumeration value of string type.

UuidStringToBytesType

new UuidStringToBytesType();

Entity value: string standard representation of the UUID. For example, 1f2d3897-a226-4eec-bd2c-d0145ef25df9.

Database value: binary string representation of the UUID.

Testing

Unit Testing

The package is tested with PHPUnit. To run tests:

./vendor/bin/phpunit

Mutation Testing

The package tests are checked with Infection mutation framework with Infection Static Analysis Plugin. To run it:

./vendor/bin/roave-infection-static-analysis-plugin

Static Analysis

The code is statically analyzed with Psalm. To run static analysis:

./vendor/bin/psalm

License

The Cycle Typecast is free software. It is released under the terms of the BSD License. Please see LICENSE for more information.

About

Helper of typecast data in Cycle ORM

Topics

Resources

License

Stars

Watchers

Forks

Languages