PHP code example of pixelfederation / doctrine-generic-types-bundle

1. Go to this page and download the library: Download pixelfederation/doctrine-generic-types-bundle 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/ */

    

pixelfederation / doctrine-generic-types-bundle example snippets


return [
    // ...
    PixelFederation\DoctrineGenericTypesBundle\PixelFederationDoctrineGenericTypesBundle::class => ['all' => true],
];



// 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 

'generic_types' => [
    JsonSerializableValue::class => JsonSerializableValueType::class,
    NativeJsonValue::class => NativeJsonValueType::class,
],

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\SymfonySerializer\Doctrine\Type\SymfonySerializerValueType;
use PixelFederation\DoctrineGenericTypesBundle\Bridge\SymfonySerializer\Value\SymfonySerializerValue;

'generic_types' => [
    SymfonySerializerValue::class => SymfonySerializerValueType::class,
],
'serializer_bridges' => [
    'symfony' => [
        'service' => 'serializer',
    ],
],

// config/bundles.php
return [
    // ...
    JMS\SerializerBundle\JMSSerializerBundle::class => ['all' => true],
];

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\JmsSerializer\Doctrine\Type\JmsSerializerValueType;
use PixelFederation\DoctrineGenericTypesBundle\Bridge\JmsSerializer\Value\JmsSerializerValue;

'generic_types' => [
    JmsSerializerValue::class => JmsSerializerValueType::class,
],
'serializer_bridges' => [
    'jms' => [
        'service' => 'jms_serializer',
    ],
],

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,
],