The package provides:
Typecasterthat help typecast data in Cycle ORM and abstractTypecastHandlerthat used it;AttributeTypecastHandlerthat use attributes for typecast data;TypeInterfacethat must be implemented by classes used inTypecasterandAttributeTypecastHandler;- classes for
DateTimeImmutable,UUID,ArrayandEnumtypes.
The package could be installed with composer:
composer require vjik/cycle-typecastuse 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;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(','),
];
}
}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);
}
}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.
new DateTimeImmutableToIntegerType();Entity value: DateTimeImmutable.
Database value: timestamp as string (example, 1609658768).
new IntegerEnumType(IntegerEnum::class);Entity value: integer typed enumeration.
Database value: enumeration value of integer type.
new StringEnumType(StringEnum::class);Entity value: string typed enumeration.
Database value: enumeration value of string type.
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.
The package is tested with PHPUnit. To run tests:
./vendor/bin/phpunitThe package tests are checked with Infection mutation framework with Infection Static Analysis Plugin. To run it:
./vendor/bin/roave-infection-static-analysis-pluginThe code is statically analyzed with Psalm. To run static analysis:
./vendor/bin/psalmThe Cycle Typecast is free software. It is released under the terms of the BSD License.
Please see LICENSE for more information.