// config/packages/pixel_federation_doctrine_generic_types.php
declare(strict_types=1);
use PixelFederation\DoctrineGenericTypesBundle\Doctrine\Type\StringValueType;
use PixelFederation\DoctrineGenericTypesBundle\Value\StringValue;
use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator;
return static function (ContainerConfigurator $container): void {
$container->extension('pixel_federation_doctrine_generic_types', [
'generic_types' => [
StringValue::class => StringValueType::class,
],
'directories' => [
'./src/Value',
],
]);
};
declare(strict_types=1);
namespace App\Value;
use PixelFederation\DoctrineGenericTypesBundle\Value\StringValue;
final readonly class FirstName extends StringValue
{
}
declare(strict_types=1);
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
use App\Value\FirstName;
#[ORM\Entity]
#[ORM\Table(name: 'person')]
class Person
{
public function __construct(
#[ORM\Column(type: FirstName::class, length: 255)]
public FirstName $firstName,
) {
}
}
use Override;
use PixelFederation\DoctrineGenericTypesBundle\Value\JsonSerializableValue;
final readonly class Address extends JsonSerializableValue
{
public function __construct(
public string $city,
public string $street,
) {
}
#[Override]
public function jsonSerialize(): array
{
return ['city' => $this->city, 'street' => $this->street];
}
#[Override]
public static function fromDbValue(mixed $dbValue): static
{
// Validate the decoded JSON structure as
use PixelFederation\DoctrineGenericTypesBundle\Bridge\SymfonySerializer\Value\SymfonySerializerValue;
final readonly class Address implements SymfonySerializerValue
{
public function __construct(
public string $city,
public string $street,
) {
}
}
use PixelFederation\DoctrineGenericTypesBundle\Bridge\JmsSerializer\Value\JmsSerializerValue;
final readonly class Address implements JmsSerializerValue
{
public function __construct(
public string $city,
public string $street,
) {
}
}
use PixelFederation\DoctrineGenericTypesBundle\Bridge\RamseyUuid\Doctrine\Type\UuidValueType;
use PixelFederation\DoctrineGenericTypesBundle\Bridge\RamseyUuid\Value\UuidValue;
'generic_types' => [
UuidValue::class => UuidValueType::class,
],
use PixelFederation\DoctrineGenericTypesBundle\Bridge\SymfonyUid\Doctrine\Type\UuidValueChar36Type;
use PixelFederation\DoctrineGenericTypesBundle\Bridge\SymfonyUid\Doctrine\Type\UuidValueType;
use PixelFederation\DoctrineGenericTypesBundle\Bridge\SymfonyUid\Value\UuidValue;
'generic_types' => [
UuidValue::class => UuidValueType::class,
// Or use UuidValueChar36Type::class for CHAR(36) storage.
],
use App\Value\EmailAddress;
use Doctrine\DBAL\Types\StringType;
use Doctrine\DBAL\Types\Type;
use Override;
use PixelFederation\DoctrineGenericTypesBundle\Doctrine\Type\BaseGenericType;
/** @extends BaseGenericType<EmailAddress> */
final class EmailAddressType extends BaseGenericType
{
#[Override]
protected static function getAbstractValueClass(): string
{
return EmailAddress::class;
}
#[Override]
protected static function createDoctrineType(): Type
{
return new StringType();
}
}
namespace App\Doctrine\Type;
use App\Serializer\ValueSerializer;
use Doctrine\DBAL\Types\JsonType;
use PixelFederation\DoctrineGenericTypesBundle\Doctrine\Type\GenericType;
use PixelFederation\DoctrineGenericTypesBundle\Value\Value;
final class SerializedValueType extends JsonType implements GenericType
{
/** @param class-string<Value<mixed>> $valueClass */
public function __construct(
private readonly string $valueClass,
private readonly ValueSerializer $serializer,
) {
}
// Implement the Doctrine conversion methods using $valueClass and $serializer.
}
namespace App\Doctrine\TypeRegistry;
use App\Doctrine\Type\SerializedValueType;
use App\Serializer\ValueSerializer;
use Doctrine\DBAL\Types\Type;
use Override;
use PixelFederation\DoctrineGenericTypesBundle\Doctrine\Type\GenericType;
use PixelFederation\DoctrineGenericTypesBundle\Doctrine\TypeRegistry\GenericTypeFactory;
use PixelFederation\DoctrineGenericTypesBundle\Value\Value;
final readonly class SerializedValueTypeFactory implements GenericTypeFactory
{
public function __construct(
private ValueSerializer $serializer,
) {
}
/** @param class-string<GenericType> $type */
#[Override]
public function supports(string $type): bool
{
return $type === SerializedValueType::class;
}
/**
* @param class-string<GenericType> $type
* @param class-string<Value<mixed>> $value
*/
#[Override]
public function create(string $type, string $value): Type
{
return new SerializedValueType($value, $this->serializer);
}
}
// config/services.php
use App\Doctrine\TypeRegistry\SerializedValueTypeFactory;
use PixelFederation\DoctrineGenericTypesBundle\Doctrine\TypeRegistry\GenericTypeFactoryProvider;
use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator;
return static function (ContainerConfigurator $container): void {
$container->services()
->set(SerializedValueTypeFactory::class)
->autowire()
->tag(GenericTypeFactoryProvider::TAG, ['priority' => 100]);
};
use App\CustomValue\SerializedValue;
use App\Doctrine\Type\SerializedValueType;
'generic_types' => [
SerializedValue::class => SerializedValueType::class,
],
Loading please wait ...
Before you can download the PHP files, the dependencies should be resolved. This can take some minutes. Please be patient.