2011-01-23 11 views
9

Doctrine2'yi öğreniyorum ve kurucuyu otomatik olarak nasıl arayacağımı sorun yaşıyorum. Örneğin benim varlık içinde ben

/** 
* @Entity 
*/ 
class User{ 
    .... 
    public function __construct() { 
     exit('in'); 
    } 
} 

var ve nesne bu şekilde olsun:

$userObj = $em->find('User', 1); 

ben veritabanından o nesneyi almak ancak yapıcı asla denir. ben

gibi bir kullanıcı oluşturmak için kod yeni bir nesne oluşturduğunuzda, bu tabii çalışır

 $this->comments = new ArrayCollection(); 

gibi doktrin belgelerinden örnek kod koymak için bile doğrulama kuralları gibi, yapıcı içinde bazı ortak şeyler koymak veya istediğiniz

$user = new User(); //now constructor works just fine 

Şimdi, varlığı almanın "doğru" yolu nedir? $ User0bj -> __ construct() ile $ em-> find() kullanıcısını her defasında el ile yapıcıdan çağırmam gerektiğinden şüpheliyim. ? Bu daha sonra berbat olur ... Ya da başka bir şey kullanmalıyım -> find() tek bir öğeyi doğru şekilde almak için? @PrePersist'i kullanabileceğimi biliyorum ve aslında doğrulama kontrolleri yapmak için kullanıyorum. Sanırım muhtemelen burada bir şey eksik ya da kurucuyu fakir bir şekilde kullanmaya çalışıyorum. Herhangi bir açıklama ve kılavuz için teşekkürler!

+0

Şimdiye kadar, hem yapıcıda hem de @PostLoad olayında çağrılan ayrı setUp() yöntemini kullanıyorum, nesne yeni Obj() ile oluşturulduğunda nesne içinde ayarlanması gereken şeyi ayarlar; ve objenin veritabanından alındığı zaman çağrılır. Benzer ikilemleri olan birine yardımcı olabilir. – Dalibor

cevap

6

I ... @PostLoad olay kanca gerekir

find veya benzeri kurucusunu çağırmak beklenmemektedir oldukça eminim.

+1

Bu yüzden kodumu koyacağım yerde bir kurucu olmak istiyorum? "$ Obj = new Obj" gibi yeni bir nesne oluşturduğumda bu satırın çağrılacağını "eğer ($ this-> id) {" diyen bir satır var görebiliyorum. Ya da bunu uyandırmalıyım: $ this -> __ constructor? – Dalibor

+0

Yea, __wakeup yönteminizden yapıcıyı çağırırsanız, çoğaltma kodunu kaydederseniz daha iyi olur. – Cobby

+0

Teşekkürler bayım. Bu yöntemi deneyeceğim ve umarım genel çalışma planına uyacaktır. – Dalibor

2

Zaten kalıcı varlık yapısını neden çağırmak istersiniz? Doğrulamanız gerektiğinde, bunu sürdürmeden önce doğrulama veya başlatmaları yapmalısınız. Yani zaten kalıcı bir varlık dediğinizde, onu doğrulamak için bir nokta yoktur. Doğrulama ve diğer başlatmaları koymak için doğru yer, yapıcının yapıcı yöntemidir. Ör.

/** 
* @Entity 
*/ 
class User{ 
    protected $name; 
    public function __construct($name) { 
     if (isset($name)) { 
      //** validate the name here */ 
      $this->name=$name; 
     } else { 
      throw new Exception("no user name set!"); 
     } 
    } 
} 

Doctrine2 belgelerine göre Doctrine2 hiçbir zaman varlıkların __construct() yöntemini çağırmaz. http://www.doctrine-project.org/docs/orm/2.0/en/reference/architecture.html?highlight=construct

+0

Evet, hiçbir zaman __constructor() çağırdığını ve bunun iyi olduğunu anlıyorum. Şimdi sorun, örneğin, kullanıcıların varlıkları düzenlemektir. Mevcut veriler dolu bir form var ve ben $ userObj = $ em-> bulmak istiyorum ('kullanıcı', $ id); e-posta alanını güncellemek için $ userObj-> setEmail ($ newEmail); Artık sorun şu ki, planım yapıcıda doğrulama kurallarını ayarlamaktı, örneğin işlevi __constructor() { $ fields = dizi ('email', 'required | email | max50'); } Bu kuralları el ile ayarlamalı mıyım? Her zaman nesnesinin kullanılmasını ayarlamak veya yapılandırmak veya ele almak istediğim başka şeylere ihtiyaç olabilir. – Dalibor

+0

Sizin durumunuzda, validasyonu setEmail ($ email) yönteminde ayarlamanız gerektiğini düşünüyorum. Örneğin. public function setEmail ($ e-posta) { // ** e-posta adresinin geçerli olduğunu kontrol et */ /** Eğer geçerli bir e-posta adresi varsa o zaman */ $ this-> email = $ email; } – Orhan

+0

Evet, sanırım bu yaklaşıma gideceğim. Ben sihirli setter ve getter yapmak istedim, "yanlış" olduğunu biliyorum ama sadece bir setProperties ($ _ POST) daha sonra her biri yazmak için daha hızlı çalışır. Sanırım çizim tahtasına geri döneceğim ... Teşekkürler – Dalibor

İlgili konular