Doctrine 2 převedení entity na pole
- Filip111
- Člen | 244
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
Musíš vytvořit mapper, který bude převádět entitu na hodnoty pro formulář a naopak. Já si napsal svůj.
- Filip111
- Člen | 244
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
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.
- Jiří Nápravník
- Člen | 710
Co vim tak Filip Prochazka pripravuje DoctrineForms.
A nejak funkcni by snad melo byt FoxyForms
Ale ja zatim porad vyuzivam zend hydrator