Wojciech Soczyński

Wojciech Soczyński Programista
eksplorator -
blog.wsoczynski.pl

Temat: Modele

Jeżeli chodzi o twój przykład z Zamówieniem na podstawie mojego przykładu :P to ja to przemyślałem tak, że Zamówienie ma w sobie Koszyk z którego powstało, a jak widzisz koszyk ma metodę listaProduktów, czyli właściwie to jest takie forwardowanie metod. Wyciągając encje z repozytorium ona ma już pobrane generalnie wszystkie rzeczy, albo jeżeli używasz Doctrine 2, to on to sprytnie jakoś pociągnie to co potrzeba.

Co do User->getAdres->getTelefon() to fajnie by było jak byś podał mniej więcej przynajmniej jak wygląda klasa User oraz czym jest adres i telefon.

Ja bym na twoim miejscu nie używał w ten sposób "getterów". Zamiast prosić o dane, lepiej prosić o wykonanie operacji. Domyślam się, że chcesz pobrać dane użytkownika czyli poza telefonem jeszcze inne rzeczy. W takim przypadku bym to zrobił tak:



class User {

private $_imie;
private $_nazwisko;
private $_adres;
private $_telefon;

public function daneUzytkownika(){
return array(
'Imię' => $this->_imie,
'Nazwisko' => $this->_nazwisko,
'Adres' => $this->_adres,
'Telefon' => $this->_telefon
);
}


}
Artur Świerc

Artur Świerc Programista PHP/Java

Temat: Modele

Dokładnie, Doctrine2 i inne ORM'y mają to jakiś sposób, wiedzą kiedy użytkownik się zagłębia i wtedy dopiero wyciągają wyniki unikając w ten sposób problemu N+1.

Ja chciałbym zrobić coś takiego:
- mam encję Uzytkownik, każdy użytkownik ma "n" zamówień
- kiedy chcę kolekcję użytkowników: new UserRepository()->findAll(), to nie wyciągam dla poszczególnych użytkowników listy zamówień, a dopiero kiedy faktycznie takie dane są mi potrzebne. Taki lazy loading :)


class User
{
private $_id = null;
private $_zamowienia = null;
public function getZamowienia()
{
if (null === $this->_zamowienia && null !== $this->_id) {
$zamowieniaRepo = new ZamowieniaRepository();
$this->_zamowienia = $zamowieniaRepo->findAllByUserId($this->_id);
}
return $this->_zamowienia;
}
}


Tylko nie wiem, czy jest to w jakiś sposób zgodne z metodyką DDD. Nie powinienem się odwoływać raczej do repozytorium z poziomu encji. Ale z drugiej strony jak to przeskoczyć? Widziałem też, że Wojtek w swoim przykładzie robił coś podobnego:


class User {
protected $_comments;
...
public function getComments()
{
$comments = new Comments();
$this->comments = $comments->getComments($this->getId());
}
}


Mam jeszcze pytanko co do QueryObject o którym pisał Alan, za bardzo nie wiem z czym to się je, a na googlach bardzo mało. Czy, jeśli opieramy się o Zend_Db, to jest to zwykły Zend_Db_Select?
Chciałbym uniknąć zawalenia metod w repozytorium typu getObiadZKartoflekamiByKotletIdAndSurowkaOrOgorek(x,x,x,x), a żeby jako parametr do metody wskakiwał jakiś obiekt np Criteria/Where.

Wojciech Soczyński:
Jeżeli chodzi o twój przykład z Zamówieniem na podstawie mojego przykładu :P to ja to przemyślałem tak, że Zamówienie ma w sobie Koszyk z którego powstało, a jak widzisz koszyk ma metodę listaProduktów, czyli właściwie to jest takie forwardowanie metod. Wyciągając encje z repozytorium ona ma już pobrane generalnie wszystkie rzeczy, albo jeżeli używasz Doctrine 2, to on to sprytnie jakoś pociągnie to co potrzeba.

Co do User->getAdres->getTelefon() to fajnie by było jak byś podał mniej więcej przynajmniej jak wygląda klasa User oraz czym jest adres i telefon.

Ja bym na twoim miejscu nie używał w ten sposób "getterów". Zamiast prosić o dane, lepiej prosić o wykonanie operacji. Domyślam się, że chcesz pobrać dane użytkownika czyli poza telefonem jeszcze inne rzeczy. W takim przypadku bym to zrobił tak:



class User {

private $_imie;
private $_nazwisko;
private $_adres;
private $_telefon;

public function daneUzytkownika(){
return array(
'Imię' => $this->_imie,
'Nazwisko' => $this->_nazwisko,
'Adres' => $this->_adres,
'Telefon' => $this->_telefon
);
}


}
Bartosz Ratajczyk

Bartosz Ratajczyk MS SQL Developer

Temat: Modele

Artur Świerc:
Chciałbym uniknąć zawalenia metod w repozytorium typu getObiadZKartoflekamiByKotletIdAndSurowkaOrOgorek(x,x,x,x), a żeby jako parametr do metody wskakiwał jakiś obiekt np Criteria/Where.

Ja to robię przez utworzenie metody getObiadByKryteria($kryteria) gdzie $kryteria = array('kotletId = $kotletId', 'surowka = true or ogorek = true'). Przy czym nie widzę przeszkód, że jeśli jest potrzeba dedykowanej funkcji, to po prostu idzie wrapper z wpisanymi wartościami, np.

public function getObiadZKartoflekamiByKotletIdAndSurowkaOrOgorek($kotletId, $czySurowka, $czyOgorek)
{
return $this->getObiadByKryteria(array('kotletId = $kotletId', 'surowka = $czySurowka or ogorek = $czyOgorek'))
}


Edit: dla purystów: filtrowanie parametrów idzie przed przekazaniem ich do metody. Oczywiście można to samo zrobić na poziomie samej metody.Bartosz Ratajczyk edytował(a) ten post dnia 14.02.11 o godzinie 06:55
Wojciech Soczyński

Wojciech Soczyński Programista
eksplorator -
blog.wsoczynski.pl

Temat: Modele

Bartosz Ratajczyk:
Artur Świerc:
Chciałbym uniknąć zawalenia metod w repozytorium typu getObiadZKartoflekamiByKotletIdAndSurowkaOrOgorek(x,x,x,x), a żeby jako parametr do metody wskakiwał jakiś obiekt np Criteria/Where.

Ja to robię przez utworzenie metody getObiadByKryteria($kryteria) gdzie $kryteria = array('kotletId = $kotletId', 'surowka = true or ogorek = true'). Przy czym nie widzę przeszkód, że jeśli jest potrzeba dedykowanej funkcji, to po prostu idzie wrapper z wpisanymi wartościami, np.

public function getObiadZKartoflekamiByKotletIdAndSurowkaOrOgorek($kotletId, $czySurowka, $czyOgorek)
{
return $this->getObiadByKryteria(array('kotletId = $kotletId', 'surowka = $czySurowka or ogorek = $czyOgorek'))
}


Edit: dla purystów: filtrowanie parametrów idzie przed przekazaniem ich do metody. Oczywiście można to samo zrobić na poziomie samej metody.

Można też zastosować wzorzec specyfikacji zamiast arraya z kryteriami:
http://blog.wsoczynski.pl/2010/09/06/wzorce-projektowe...Wojciech Soczyński edytował(a) ten post dnia 14.02.11 o godzinie 07:48



Wyślij zaproszenie do