Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Data Objects i Data Access Objects
become
post
Post #1





Grupa: Zarejestrowani
Postów: 88
Pomógł: 0
Dołączył: 12.01.2007

Ostrzeżenie: (0%)
-----


Witam. Chciałbym trochę rozwinąć myśl NoiseMC. Bo Twoje podejście mnie lekko zaintrygowało.

Rozumiem że wynika ono z modelu MVC ?

Mam pytanie odnośnie tego co napisłeś.
Jak skorelowac ze sobą konkretny obiekt Model i nie-Model ?
Chodzi mi o to, że jeżeli utworzę dwie klasy to bede mial 2 obiekty. Jezeli Data Object ma przechowywać tylko dane, to rozumiem, że nie powinien on mieć wogóle metod manipulującymi danymi ? Nawet gettery ?

Załużmy taką sytuację.
pobieram z bazy Artykul. Chcialbym zmienic mu opis i zrobic update danych na bazie.
Czy dobrze rozumiem, ze klasa Data Access Objects zajmuje sie pobieraniem danych i zwracaniem obiektu a po poprawieniu przekazuje obiekt to Data Access Objects i go zapisuje ?
Chyba ze umiescic go w klasie model na stale. No nie wiem.

Np. Mam taką klase

  1. <?php
  2. class ArticleInfo() {
  3.  
  4.  var $id;
  5.  var $title;
  6.  var $info;
  7.  var $oAuthor;
  8.  
  9.  function __construct ($id=null, $title=null, $info=null, Author $author=null) {
  10. $this->id=$id;
  11. $this->title=$title;
  12. $this->info=$info;
  13. $this->oAuthor=$author;
  14.  }
  15.  
  16.  function getTitle() {
  17. return $this->title;
  18.  }
  19. }
  20.  
  21.  
  22. class ArticleInfo_Model($oDB) {
  23.  
  24.  var $oDB;
  25.  
  26.  function getArticleInfoById($id) {
  27.  $sQ="SELECT *
  28.  FROM articles
  29.  WHERE id_article=?";
  30.  
  31. $aArticle=$this->$oDB->getRow($sQ, array($id));
  32.  
  33. if (!is_null($aArticle) {
  34.  $modelAuthor=new Author_Model($this->oDB);
  35.  $oAuthor=$modelAuthor->getAuthor($aArticle['authorid');
  36.  return new ArticleInfo($id, $aArticle['title'], $aArticle['info'], $oAuthor);
  37. }
  38.  }
  39. }
  40.  
  41. class Author() {
  42.  
  43.  var $id;
  44.  var $firstname;
  45.  var $lastname;
  46.  var $email;
  47.  var $login;
  48.  var $password;
  49.  
  50.  function __construct($id=null, $firstname=null, $lastname=null, $email=null, $login=null, $password=null) {
  51. $this->id=$id;
  52. $this->firstname=$firstname;
  53. $this->lastname=$lastname;
  54. $this->email=$email;
  55. $this->login=$login;
  56. $this->password=$password;
  57.  }
  58.  
  59.  function getId() {
  60. return $this->id;
  61.  }
  62.  
  63.  function getFirstName() {
  64. return $this->firstname;
  65.  }
  66.  
  67.  
  68. }
  69.  
  70. class Author_Model($oDB) {
  71.  
  72.  var $oDB;
  73.  
  74.  function getAuthor($id) {
  75.  
  76. $sQ="
  77. SELECT * FROM author WHERE id_author=?
  78. ";
  79.  
  80. $aAuthor=$this->$oDB->getRow($sQ, array($id));
  81.  
  82. if (!is_null($aAuthor) {
  83.  return new Author($id, $aAuthor['firstname'], $aAuthor['lastname'], $aAuthor['email'], $aAuthor['login'], $aAuthor['password']);
  84. }
  85.  }
  86. }
  87. ?>


i teraz wykorzystanie

  1. <?php
  2. $oDB=new DB();
  3.  $oDB->connect(DSN);
  4.  
  5.  $html=new Smarty();
  6.  
  7.  $modelArticleInfo=new ArticleInfo_Model($oDB);
  8.  $oArticleInfo=$modelArticleInfo->getArticleInfoById(34);
  9.  
  10.  $html->assign("article",$oArticleInfo);
  11. ?>


W ten sposób wyciągam dane konkretnego artykułu (po jego ID).
I co o tym myslicie ? Czy to jest prawidłowo ?

Czy moglbym stworzyc np.
klasę Articles_Model, ktora zawieralalby metody zwracajace:
1. obiekt ArtykulInfo (class ArticleInfo)
2. obiekt Artykul (class Article)
3. lista info artykulow danej kategorii -> tablica obiektow class ArticleInfo

Ten post edytował become 30.11.2007, 12:44:08
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
become
post
Post #2





Grupa: Zarejestrowani
Postów: 88
Pomógł: 0
Dołączył: 12.01.2007

Ostrzeżenie: (0%)
-----


Moze inaczej.

Spróbujmy zrobić na przykładzie takiej funkcjonalności.
Nie traktujcie tego że chcę iść na łatwiznę i szukam gotowców. Znajomy, który pracuje w gratka.pl polecił mi nauke na przykładach (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Wiec próbuje stworzyć takie przykłady.

Aby było jak najprościej przyjmijmy ze nie stosujemy interfejsów i klas abstakcyjnych.

Załóżmy że chcemy mieć następujące obiekty.

1. ArtykulWstep (pola: artykul_id, tytul, wstep)
2. Artykul (pola: autor, artykul_id, tytul, wstep, tresc)
3. Autor (id, imie,nazwisko)

oraz chcielibyśmy uzyskać konkretny artykuł po jakimś ID oraz listę artykulWstep z danej kategorii.



Przede wszystkim.
  1. <?php
  2.  
  3. class Autor_DO {
  4.  
  5.  var $id;
  6.  var $imie;
  7.  var $nazwisko;
  8.  
  9.  function __construct($id=null, $imie=null, $nazwisko=null) {
  10. $this->id=$id;
  11. $this->imie=$imie;
  12. $this->nazwisko=$nazwisko;
  13.  }
  14. }
  15.  
  16. class Autor_SQL_DAO {
  17.  
  18.  var $DB;
  19.  
  20.  function __construct($DB=null) {
  21. if (is_null($DB)) return null;
  22. $this->DB=$DB;
  23.  }
  24.  
  25.  function getAutorById($id=null) {
  26. if (is_null($id)) return null;
  27. $sql="
  28. SELECT *
  29. FROM autor
  30. WHERE autor_id=?
  31. ";
  32.  
  33. $aRes=$this->DB->getRow($sql, array($id));
  34. if (is_array($aRes) and count($aRes)==1) {
  35.  return new Autor_DO($aRes['autor_id'], $aRes['imie'], $aRes['nazwisko']);
  36. }
  37. return null;
  38.  }
  39. }
  40.  
  41. class ArtykulWstep_DO {
  42.  
  43.  var $artykul_id;
  44.  var $tytul;
  45.  var $wstep;
  46.  
  47.  function __construct($id=null, $tytul=null, $wstep=null) {
  48. $this->artykul_id=$id;
  49. $this->tytul=$tytul;
  50. $this->wstep=$wstep;
  51.  }
  52. }
  53.  
  54. class Artykul_DO extends ArtykulWstep_DO {
  55.  
  56.  var $oAutor;
  57.  var $tresc
  58.  
  59.  function __construct($id=null, $tytul=null, $wstep=null, $tresc=null, Autor_DO $autor=null) {
  60. $this->tresc=$tresc;
  61. $this->oAutor=$autor;
  62. parent::__construct($id, $tytul, $wstep);
  63.  }
  64. }
  65.  
  66. class Artykul_SQL_DAO {
  67.  
  68.  var $DB;
  69.  
  70.  function __construct($DB) {
  71. $this->DB=$DB;
  72.  }
  73.  
  74.  function getArtykulById($id=null) {
  75. if (is_null($id)) return null;
  76. $sql="
  77. SELECT *
  78. FROM artykul
  79. WHERE artykul_id=?
  80. ";
  81.  
  82. $aRes=$this->DB->getRow($sql, array($id));
  83. if (is_array($aRes) and count($aRes)==1) {
  84.  $autor_sql_dao=new Autor_SQL_DAO($this->DB);
  85.  $oAutor=$autor_model->pobierzAutora($aRes['autor_id']); // obiekt autor
  86.  return new Artykul_DO($aRes['artykul_id'], $aRes['tytul'], $aRes['wstep'], $aRes['tresc'], $oAutor);
  87. }
  88. return null;
  89.  }
  90.  
  91.  /*
  92.   Zwraca obiekt ArtykulWstep_DO
  93.  */
  94.  function getArtykulWstepById($id=null) {
  95. if (is_null($id)) return null;
  96. $sql="
  97. SELECT *
  98. FROM artykul
  99. WHERE artykul_id=?
  100. ";
  101.  
  102. $aRes=$this->DB->getRow($sql, array($id));
  103. if (is_array($aRes) and count($aRes)==1) {
  104.  return new ArtykulWstep_DO($aRes['artykul_id'], $aRes['tytul'], $aRes['wstep']);
  105. }
  106. return null;
  107.  }
  108.  
  109.  /* 
  110.   Zwraca tablice obiektow ArtykulWstep_DO z kategori o podanym ID
  111.  */
  112.  function getListaArtykulowWstepByCategoryId($id=null) {
  113. if (is_null($id)) return null;
  114. $sql="
  115. SELECT *
  116. FROM artykul
  117. WHERE kategoria=?
  118. ";
  119.  
  120. $aRes=$this->DB->getAll($sql, array($id));
  121. if (is_array($aRes) and count($aRes)>=1) {
  122.  for ($i=0; $i<count($aRes); $i++) {
  123. $aoArtykulyWstep[$i]=new ArtykulWstep_DO($aRes['artykul_id'], $aRes['tytul'], $aRes['wstep']);
  124.  }
  125.  return $aoArtykulyWstep;
  126. }
  127. return null;
  128.  }
  129. }
  130. ?>


co o tym myslicie ? Czy jako początkujacy w OOP moglbym tak to zrobic ?

wlasnie sobie tak mysle, czy klasa User_DAO nie powinna rozszerzać możliwosci klasy DO ?

czyli byloby:

  1. <?php
  2. class User {
  3.  
  4. }
  5. ?>


i

  1. <?php
  2. class User_DAO extends User {
  3. }
  4. ?>


(IMG:http://forum.php.pl/style_emoticons/default/questionmark.gif)
Bo naprawde, jezeli rozdziele te dwie klasy, to jak mam operowac na danych obiektu.
Zalozmy taka sytuacje. Uzytkownik po zalogowaniu chce zmienic swoje dane osobowe.
klasa User_DAO zwraca obiekt User z danymi. Przekazuje te dane do formularza. Po ich sprawdzeniu dane te chce zapisac.
To gdzie powinny trafic dane z formularza ? Do obiektu User, czy do obiektu User_DAO, a może do obiektu User, a obiekt User przekazać do obiektu User_DAO, który zapisze dane do bazy.
Normalnie chyba jednak powinienem najpierw robic jak najprościej, bo siedze juz 3 godziny nad klasa Authentication i User i co chwile zmieniam koncepcje.

Ten post edytował become 1.12.2007, 17:41:10
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 4.10.2025 - 08:27