aurimasniekis/doctrine-json-object-type

1.0.0 2017-05-16 10:29 UTC

This package is auto-updated.

Last update: 2023-01-13 23:32:19 UTC


README

Latest Version Software License Build Status Code Coverage Quality Score Total Downloads

Email

Doctrine Json Object Type provides a ability to serialize/deserialize object which implements JsonObject interface to json and backwards.

Install

Via Composer

$ composer require aurimasniekis/doctrine-json-object-type

Configuration

Symfony:

doctrine:
    dbal:
        url: '%env(DATABASE_URL)%'
        types:
          json_object: AurimasNiekis\DoctrineJsonObjectType\JsonObjectType

Plain Doctrine:

<?php

use Doctrine\DBAL\Types\Type;

Type::addType('json_object', 'AurimasNiekis\DoctrineJsonObjectType\JsonObjectType');

Usage

Value object should implement JsonObject interface.

<?php

use AurimasNiekis\DoctrineJsonObjectType\JsonObject;

class ValueObject implements JsonObject
{
    private $name;
    
    public function setName($name)
    {
        $this->name = $name;
    }
    
    public function getName()
    {
        return $this->name;
    }
    
    public static function fromJson(array $data)
    {
        $inst = new self();
        
        $inst->setName($data['name']);
        
        return $inst;
    }
    
    public function jsonSerialize()
    {
        return [
            'name' => $this->getName()
        ];
    }
}

Entity

<?php

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 * @ORM\Table(name="entity")
 */
class Entity
{
    /**
     * @var int
     *
     * @ORM\Column(type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * "json_object" is extended "json" type 
     * 
     * @var ValueObject
     *
     * @ORM\Column(type="json_object)
     */
    private $value;

    /**
     * @return int
     */
    public function getId(): int
    {
        return $this->id;
    }

    /**
     * @return ValueObject
     */
    public function getValue()
    {
        return $this->value;
    }

    /**
     * @param ValueObject $value
     */
    public function setValue(ValueObject $value)
    {
        $this->value = $value;
    }
}

Usage

<?php

$value = new ValueObject();
$value->setName('foo_bar');

$entity = new Entity();
$entity->setValue($value);

$em->persist($entity);
$em->flush(); // INSERT INTO `entity` (`id`, `value`) VALUES (1, '{"name": "foo_bar", "__class": "ValueObject"}');


$findResult = $repo->find(1);

/// $findResult->getValue() === $value;

Testing

$ composer test

Contributing

Please see CONTRIBUTING and CONDUCT for details.

License

Please see License File for more information.