2012-10-23 19 views
7

bind() kullanımı dışında bir doctrine2 ODM varlık sınıfından bir Zend2 formuna veri bağlamada daha iyi bir yol var mı?Binding Zend2 form verileri doctrine2 ODM

Eğer öyleyse, bu ne olurdu? Verileri sadece bir dizi olarak alıp her alanı geçebilir miyim? Bununla uğraşıyorum ve muhtemelen olması gerekenden daha zor hale getiriyorum.

bind() işlevini çağırdığımda, varsayılan hidratöre başvuran bir Zend hatası verir. Varlık sınıfımda özel bir şey yapmam gerekiyor mu?

Düzenleme: İşte Zend atıyor kesin hatalardır

~ \ satıcı \ zendframework \ zendframework \ kütüphane \ Zend \ stdlib \ Nemlendirici \ ArraySerializable.php: 35

Zend \ stdlib \ Nemlendirici \ ArraySerializable :: özü Onlar bana ihtiyacım düşündürmek sağlanan nesne getArrayCopy()

uygulamalarını beklediğini birine:

  1. kullanım
+0

kullanmak module.config.php aşağıdaki kodu kullanabilirsiniz. ZF2'nin çalışma biçiminiz, bir nesneye/varlığa formunuza bağlanır ve atanan Hydrator, başvurulan Form Formlarının uygun şekilde eşlendiğinden emin olur. Bu aslında çok basit bir kullanım durumu ve iyi bir endişe ayrımıdır, hata mesajlarının verdiği gibi, her zaman WHERE'nin ne olacağını bileceksiniz. – Sam

cevap

14

: sende

public function getArrayCopy() 
{ 
    return get_object_vars($this); 
} 
+1

Otomatik hidrasyon sihri, ZF2 stili uygulamak için sağlanan nesneyi bekler. Kolay öğrenme eğrisi ... –

+1

get_object_vars işlevi tarafından ilgi çekiciydi. Referans: [get_object_vars] (http://php.net/manual/en/function.get-object-vars.php) - "Belirtilen nesnenin erişilebilir statik olmayan özelliklerini kapsamına göre alır." –

+1

Daha açık bir şekilde, bu dosyaya yukarıdaki yöntemi ekliyoruz: '\ zf2-tutorial \ module \ Album \ src \ Album \ Model \ Album.php'. –

1

I (ben de uygulamak için en iyi şekilde anlamaya olurdu,) (ı nasıl uygulanacağı araştırma olurdu) Hidratörler veya

  • kullanım doctrine2 en Hidratörler Zends varlık sınıfımdaki populate yöntemini kullanın. bu

    public function populate($data = array()) 
        { 
         $this->id = (isset($data['id'])) ? $data['id'] : null; 
         $this->username = (isset($data['username'])) ? $data['username'] : null; 
         $this->pass = (isset($data['pass'])) ? $data['pass'] : null;    
    
        } 
    

    gibi bir şey ve bu durumda kontrol ünitesine böyle fonksiyon şey doldurmak kullanabilirsiniz.

    $user = new User(); 
    $request = $this->getRequest(); 
    $user->populate($request->getPost()); 
    

    Tercümenizi doğru anlayabildiğimden emin değilim.

  • +0

    Temel olarak, sorularım bir editAction() ile ilgilidir. Kullanıcıların, zaten yayınladıkları bilgileri düzenleyebilmelerini istiyorum. Biraz araştırma yaptım ve Zend'in varlığımdan veri çekecek ve formu düzenlemek üzere doldurulacak bir bind() yöntemini kullandığını gördüm. Şu anda $ form = new Form(); $ Form-> bağlamak ($ ​​varlık). $ Varlıkım doctrne2's getServiceLocator() kullanıyor ve getQueryBuilder() kullanarak bir sorgu yapıyorum. EditAction'a gittiğimde aşağıdaki hatayı alıyorum Zend \ Stdlib \ Hydrator \ ArraySerializable :: extract getArrayCopy() – bl4design

    1

    Neyse ki bu öğretici takip ederseniz, sizin tarafta da daha fazla bir şey gerekmez:

    http://samminds.com/2012/07/a-blog-application-part-1-working-with-doctrine-2-in-zend-framework-2/ Neredeyse aynı yaklaşımı kullanmak ve iyi çalışan (neredeyse) 'dir. Dikkat etmeniz gereken iki şey:

    1.) Tablonuzdaki tüm verileri doğruladığınızdan emin olun (veya en azından boş olmayanlar), çünkü yalnızca doğrulanmış alanlar DB'ye gönderilir. Bu blogun yazarı tarafından bana söylendi. :)

    2.) düzenleme şekli için görünüm oluşturduğunuzda, rotaya id ekleyin:

    $form->setAttribute('action', $this->url('post', 
            array('action'=>'add', 'id'=>"$this->id")))->prepare(); 
    

    İyi şanslar!

    Zend \ Formu size varlık sınıfında böyle bir şey olması gerekir varlığınızı nemlendiricili edememek için
    2

    .../Model/XXXXTable.php
    bir işlev istiyorum tanımlamak bir kayıt almak için.

    $id = (int)$id; 
        $row = $this->tableGateway->select(array('id'=>$id)); 
        $row = $row->current(); //this line is very important 
    
    +0

    teşekkürler, gerçekten saatlerimi kurtardım. –

    2

    ben gerçek hata mesajı içerecek şekilde sorunuzu değiştirmek Lütfen doktrin Hydrator

    $form = new ...; 
    $dm = $sm->get('doctrine.documentmanager.odm_default'); 
    $form->setHydrator(new \DoctrineModule\Stdlib\Hydrator\DoctrineObject($dm)); 
    return $form;