Doctrine 2 převedení entity na pole

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Filip111
Člen | 244
+
0
-

Ahoj,

jakým způsobem lze nejlépe převést entitu do pole? Potřebuji to hlavně pro předávání defaultních hodnot formuláři.

Našel jsem starší diskusi, ale odpověď jsem tam nenašel: https://forum.nette.org/…-setdefaults

Potom jsem našel pro mě velice inspirativní FlameCMS, kde je použitá funkce get_object_vars
https://github.com/…e/Entity.php#L47

Ta ale nezafunguje pro relace – vloží tam celý objekt.
(např. pro sloupec userId to vloží namísto integeru celou definici relace)

Díky.

Editoval Filip111 (4. 10. 2012 13:08)

Filip Procházka
Moderator | 4668
+
0
-

Musíš vytvořit mapper, který bude převádět entitu na hodnoty pro formulář a naopak. Já si napsal svůj.

bazo
Člen | 620
+
0
-

najjednoduchsie je

array(
	value1 => $entity->getValue1(),
	value2 => $entity->getValue1(),
	atd
)
Filip111
Člen | 244
+
+1
-

Některá řešení se mi zdála zbytečně složitá (resp. jsem je nepochopil :) – nakonec jsem po inspiraci https://github.com/…tityForm.php a ještě někde jinde (ale už nevim kde) vytvořil jednoduchou funkci v base entitě toArray, která dělá co potřebuji – nevím, zda to není příliš krátkozraké a třeba nenarazím na nějaký problém.

@bazo: zpočátku jsem to chtěl takto psát, ale hned po prvních dvou entitách jsem dospěl k závěru, že si tím jen přidělávám práci

public function toArray() {
		$reflection = new \ReflectionClass($this);
		$details = array();
		foreach ($reflection->getProperties(\ReflectionProperty::IS_PROTECTED) as $property) {
			if (!$property->isStatic()) {
				$value = $this->{$property->getName()};

				if ($value instanceof IEntity) {
					$value = $value->getId();
				} elseif ($value instanceof ArrayCollection || $value instanceof PersistentCollection) {
					$value = array_map(function (BaseEntity $entity) {
						return $entity->getId();
					}, $value->toArray());
				}
				$details[$property->getName()] = $value;
			}
		}
		return $details;
	}

Editoval Filip111 (12. 10. 2012 13:47)

klingac
Člen | 3
+
0
-

horeuvedene riesenie od @Filip111 som chvilu uspesne pouzival. casom sa ale zacali objavovat problemy, napr. pri pouzivani proxies.
ako lepsie riesenie sa ukazalo pouzit bud Zend\StdLib\Hydrator (packagist) alebo JMS Serializer (packagist) alebo Symfony Serializer (packagist)

nakoniec u mna vyhral Zend Hydrator – ma menej zavislosti. v entite mam metodu toArray, pripadne fromArray

use Zend\Stdlib\Hydrator;
abstract class Entity
{
    public function toArray()
    {
        $hydrator = new Hydrator\ClassMethods();
        return $hydrator->extract($this);
    }

    public function fromArray($values)
    {
        $hydrator = new Hydrator\ClassMethods();
        $hydrator->hydrate($values, $this);
    }
}

este lepsie by bolo mozne umietnit obe metody do samostatnej triedy/mappera. ale zatila mi plne vyhovuje toto riesenie.

Tomáš Votruba
Moderator | 1114
+
0
-

Lze tento problém s Doctrine 2.4 řešit nějak jinak?

Jiří Nápravník
Člen | 710
+
+1
-

Co vim tak Filip Prochazka pripravuje DoctrineForms.

A nejak funkcni by snad melo byt FoxyForms

Ale ja zatim porad vyuzivam zend hydrator