2013-03-11 13 views
5

Pracuję z zf2.1.3 i doktryną 2. Próbowałem nawodnić informacje na temat mojej klasy i zdałem sobie sprawę, że DoctrineModule\Stdlib\Hydrator\DoctrineObject nie działa z polami, które ją podkreśliły, takimi jak cat_id.Doctrine 2 Hydrator - pola z podkreśleniem

Oto przykład:

/* namespace Application\Entity; */ 

class Foo 
{ 
    private $cat_id; 
    private $cat_name; 

    public function getCatId() 
    { 
     return $this->cat_id; 
    } 

    public function setCatName($name) 
    { 
     $this->cat_name = $name; 
     return $this; 
    } 

    public function getCatName() 
    { 
     return $this->cat_nome; 
    } 
} 

class Bar 
{ 
    private $id; 
    private $name; 

    public function getId() 
    { 
     return $this->id; 
    } 

    public function setName($name) 
    { 
     $this->name = $name; 
     return $this; 
    } 

    public function getName() 
    { 
     return $this->nome; 
    } 
} 

/* namespace Application\Controller; */ 

use \DoctrineModule\Stdlib\Hydrator\DoctrineObject; 
public function indexAction() 
{ 
    $hydrator = new DoctrineObject($this->getEntityManager(), 'Application\Entity\Foo'); 
    $foo = $hydrator->hydrate(array('cat_name' => 'Frank Moraes'), new Foo()); 
    \Zend\Debug\Debug::dump($foo, 'Foo Hydrator'); 

    $hydrator = new DoctrineObject($this->getEntityManager(), 'Application\Entity\Bar'); 
    $bar = $hydrator->hydrate(array('name' => 'Frank Moraes'), new Bar()); 
    \Zend\Debug\Debug::dump($inscrit, 'Bar Hydrator'); 
} 

Ten kod zwraca następujący:

Foo Hydrator 
object(Application\Entity\Foo) 
    private 'cat_id' => null 
    private 'cat_name' => null 

Bar Hydrator 
object(Application\Entity\Foo) 
    private 'id' => null 
    private 'name' => 'Frank Moraes' 

Więc moje pytanie brzmi: Dlaczego Doktryna Hydrator nie działa w dziedzinach, które mają podkreślić w nim? Jak mogę to ułatwić?

Dziękujemy!

Edited

Przepraszamy za długi czas bez odpowiedzi. Nie mam dostępu do SO w mojej pracy!

Próbowałem następujące:

$hydrator = new DoctrineObject($this->getEntityManager(), 'Application\Entity\Foo', false); 

Na przykład napisałem tutaj, ten parametr false działa dobrze.

Ale to nie zadziałało, gdy wiążę klasę w formularzu!

Ktoś ma wskazówkę?

+0

będę pisać to pytanie na doktrynie grupować użytkowników Google. –

+0

To dlatego, że domyślny inflector nie obsługuje znaków podkreślenia. Musisz go poprawić samodzielnie lub opublikować problem w module do śledzenia problemów z modułem doktryny na https://github.com/doctrine/DoctrineModule/issues Mogę Ci teraz powiedzieć, że nie mam czasu szukać w to jednak teraz. – Ocramius

+0

Napisałem problem na https://github.com/doctrine/DoctrineModule/issues/190 – vinigarcia87

Odpowiedz

9

Kilka miesięcy po tym został poproszony, ale byłem sprawdzenie kodu źródłowego DoctrineObject nawilżacz właśnie teraz, i myślę, że to, co się dzieje:

Domyślnie chyba skonstruować DoctrineObject nawilżającym z flagą byValue jako false, hydrator będzie działał w trybie byValue. Oznacza to, że próbuje on konstruować nazwy metod getter i setter z wartości, które próbujesz uwodnić, i sposób, w jaki to robi, wywołując ucfirst na nazwie pola i poprzedzając go get/set.

Na przykład masz cat_name, więc wypróbuje metodę getter getCat_name, która jest wyraźnie niepoprawna.

Masz 4 opcje, a następnie:

  • A:camelCase swoje nazwy zmiennych
  • B: Ustaw byValue false (tak, że próbuje uzyskać dostęp do zmiennych bezpośrednio) [chociaż Myślę, że w takim przypadku może być konieczne podanie zmiennych ... Nie jestem pewien, jak wpłynie na widoczność, ponieważ tego wcześniej nie próbowałem]
  • C: Użyj innej nawodnienie Strategy lub
  • D: Po prostu mają dziwne nazwy gettera i setera, takie jak getCat_name (proszę tego nie robić).
+2

Dzięki za umieszczenie tego! Rozwiązałem to, zmieniając nazwy zmiennych na camelCase. Dobrze znać przyczynę tego problemu! – vinigarcia87

+0

Nie ma problemu! Cieszę się, że to pomaga. –

+0

Dla opcji ** B ** nie należy ustawiać właściwości jako publicznej, ponieważ spowoduje to [przerwanie leniwego ładowania] (http://stackoverflow.com/questions/4090609/how-can-public-fields-break-lazy- loading-in-doctrine-2). Jeśli chcesz uzyskać dostęp do swoich właściwości bez modułów pobierających i ustawiających, powinieneś zaimplementować [magic '__get' i' __set'] (http://php.net/manual/en/language.oop5.magic.php) – Wilt

0

Szybkie i brudne ...

foreach ($form as $key => $value) { 
     while ($pos = strrpos($key,'_')) {         
      $key = substr_replace($key, '', $pos, 1); 
      $capitalized = strtoupper($key[$pos]); 
      $key[$pos] = $capitalized;         
     } 
     $data[$key] = $value; 
    } 
0

Można nadal używać tej sztuczki:

/** @ORM\Column(name="column_name", type="string") */ 
protected $columnName; 

function get(...); 
function set($columnName){$this->columnName = $columnName} 

Nadzieja pomaga