Skip to content
⬅️ ➡️ Convert Doctrine entity to array and conversely
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
.phpstorm.meta add phpstorm.meta Apr 9, 2019
src TargetEntityFieldAdapter skips ManyToMany Apr 8, 2019
tests TargetEntityFieldAdapter skips ManyToMany Apr 8, 2019
.gitignore nettrine Feb 22, 2019
.travis.yml
README.md
codeception.yml Initial commit Nov 16, 2018
composer.json
ruleset.xml

README.md

Entity to array and conversely

Build Status

Nette instalace

extensions:
    hydrator: Nettrine\Hydrator\DI\HydratorExtension

Základní použití

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

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

Entity na pole

$array = $hydrator->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 $object, string $property) { ... }
	
	public function set(object $object, string $property, $value): void { ... }
	
}

Nette registrace:

hydrator:
    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:

hydrator:
    adapters:
        fields:
            - Nettrine\DoctrineHydration\Adapters\CallbackFieldAdapter
            - Nettrine\DoctrineHydration\Adapters\TargetEntityFieldAdapter
        array:
            - Nettrine\DoctrineHydration\Adapters\JoinArrayAdapter
            - Nettrine\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 = $hydrator->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 = $hydrator->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:

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

Hodnota property $name bude nyní Foo.

TargetEntityFieldAdapter

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

$hydrator->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(FieldArgs $args): bool {
		// funguj jen když typ je image a není asociace
		return !$args->metadata->isAssociation($field) && $args->metadata->getFieldMapping($field)['type'] === 'image';
	}

	public function work(FieldArgs $args): void {
		$image = new Image($value);
		if ($args->hasSettingsSection('images')) {
			$image->setName($args->getSettingsSection('images'));
		}
		$this->storage->save($image);
		
		$args->value = $image;
	}

}

Registrace v nette:

hydrator:
    adapters:
        fields: 
            - CustomFieldAdapter

Použití:

$hydrator->toFields($obj, [
	'avatar' => __DIR__ . '/avatar.png',
], [
	'images' => [
		'avatar' => 'foo.png',
	]
]);
You can’t perform that action at this time.