Statistics
5
0
0
13d
Badges
Dependencies

Entity to array and conversely

Build Status

Nette instalace

extensions:
    hydration: WebChemistry\DoctrineHydration\DI\HydrationExtension

Základní použití

$entity = $hydration->toFields(Entity::class, [
	'name' => 'foo',
	'field' => 'value',
]);

$entity = $hydration->toFields($entityObj, [
	'name' => 'foo',
	'field' => 'value',
]);

Entity na pole

$array = $hydration->toArray($entity);

Vlastní ArrayAccessor

Slouží k získání hodnoty z objektu nebo zapsání hodnoty do objektu.

class CustomPropertyAccessor implements IPropertyAccessor {
	
	public function get($object, string $property) { ... }
	
	public function set($object, string $property, $value): void { ... }
	
}

Nette registrace:

hydration:
    propertyAccessor: CustomPropertyAccessor

Adaptéry

Máte vlastní pravidla pro získání nebo zapsání hodnoty do objektu? Nebo vám nestačí současná funkcionalita? Můžete je rozšířit přes adaptery.

Všechny adaptéry se musí zaregistrovat přes addFieldAdapter nebo addArrayAdapter metody.

V nette:

hydration:
    adapters:
        fields:
            - WebChemistry\DoctrineHydration\Adapters\CallbackFieldAdapter
            - WebChemistry\DoctrineHydration\Adapters\TargetEntityFieldAdapter
        array:
            - WebChemistry\DoctrineHydration\Adapters\JoinArrayAdapter
            - WebChemistry\DoctrineHydration\Adapters\ManyToOneAdapter

ArrayAdapter

Implementují rozhraní IArrayAdapter. Vestavěné adaptéry:

ManyToOneArrayAdapter

Všechny objektové asociace převede na ID.

$entity = new Assoc class {
	public $id = 42;
	
	public $foo = 'foo';
	
	/**
	 * @ManyToOne(targetEntity="Assoc")
	 */
	public $assoc;
};

$entity->assoc->id++;

$array = $hydration->toArray($entity);

$array === [
	'id' => 42,
	'assoc' => 43,
];

JoinArrayAdapter

Objektovou asociaci převede na dané pole

$entity = new Assoc class {
	public $id = 42;
	
	public $foo = 'foo';
	
	/**
	 * @ManyToOne(targetEntity="Assoc")
	 */
	public $assoc;
};

$entity->assoc->id++;

$array = $hydration->toArray($entity, [
	'joins' => [
		'assoc' => 'foo'
	]
]);

$array === [
	'id' => 42,
	'assoc' => 'foo',
];

FieldAdapter

Implementují rozhraní IFieldAdapter. Vestavěné adaptéry:

CallbackFieldAdapter

Můžeme použít vlastní callback na pole:

$hydration->toFields($obj, [
	'name' => 'foo',
], [
	'callbacks' => [
		'name' => function ($value) {
			return ucfirst($value);
		},
	] 
]);

Hodnota property $name bude nyní Foo.

TargetEntityFieldAdapter

Pokud se jedná o asociaci, tak se najde entita:

$hydration->toFields($obj, [
	'assoc' => 42, // najde se položka s hodnotou 42
]);

Tvorba vlastního adapteru

Máme svojí anotaci image

/**
 * @ORM\Column(type="image")
 */

a chceme automaticky ukládat obrázky při hydrataci


class CustomFieldAdapter implements IFieldAdapter {

	public function __construct(IImageStorage $storage) { ... }

	public function isWorkable($object, string $field, Metadata $metadata, array $settings): bool {
		// funguj jen když typ je image a není asociace
		return !$metadata->isAssociation($field) && $metadata->getFieldMapping($field)['type'] === 'image';
	}

	public function work($object, string $field, $value, Metadata $metadata, array $settings) {
		$image = new Image($value);
		if (isset($settings['images'][$field])) {
			$image->setName($settings['images'][$field]);
		}
		$this->storage->save($image);
		
		return $image;
	}

}

Registrace v nette:

hydration:
    adapters:
        fields: 
            - CustomFieldAdapter

Použití:

$hydration->toFields($obj, [
	'avatar' => __DIR__ . '/avatar.png',
], [
	'images' => [
		'avatar' => 'foo.png',
	]
]);

Is this addon outdated? Did you find an issue? Please report it.

Componette Componette admin@componette.com