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
Cysiaczek
post
Post #2





Grupa: Moderatorzy
Postów: 4 465
Pomógł: 137
Dołączył: 26.03.2004
Skąd: Gorzów Wlkp.




To po prostu użyj Propela - szkielet prostego serwisu zrobisz w kilka godzin i zapomnisz, czym są zapytania SQL (IMG:http://forum.php.pl/style_emoticons/default/haha.gif) .

Pozdrawiam.
Go to the top of the page
+Quote Post
splatch
post
Post #3





Grupa: Zarejestrowani
Postów: 487
Pomógł: 7
Dołączył: 7.01.2004
Skąd: Warszawa

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


Cytat(Cysiaczek @ 30.11.2007, 16:16:42 ) *
To po prostu użyj Propela - szkielet prostego serwisu zrobisz w kilka godzin i zapomnisz, czym są zapytania SQL (IMG:http://forum.php.pl/style_emoticons/default/haha.gif) .

@Cysiaczek wszyscy dobrze wiemy, że Propel nie jest złotym środkiem, a w przypadku DAO nie ma problemu by wykorzystać ORM. Wystarczy nam przecież obiekt, który bez większych problemów da się zapisać. Problem w tym, że Propel dorzuca swoje metody etc, nie wspiera obiektów lekkich, przeźroczystych i to utrudnia wykorzystanie go do tworzenia warstwy domenowej. Jakkolwiek przy odrobinie wysiłku dało by się. Dla zainteresowanych - w aplikacjach opartych na Springu mimo wykorzystania potężnego narzędzia jakim jest bez wątpienia Hibernate, tworzy się interfejsy oraz ich implementacje, które dopiero pod spodem korzystają z tego co oferuje ORM.

Spójrzmy na klasę DaoSupport:
afterPropertiesSet() - walidacja danych
checkDaoConfig() - walidacja konfiguracji
initDao() - inicjowanie DAO

Następnie mamy do dyspozycji rozszerzenia dla różnych bibliotek. Od ogólnych implementacji - JPA poprzez Hibernate i Toplink po SqlMap (iBatis) i JDBC (czytaj natywne zapytania).
CciDaoSupport, HibernateDaoSupport, JdbcDaoSupport, JdoDaoSupport, JpaDaoSupport, SqlMapClientDaoSupport, TopLinkDaoSupport.

Wierz mi, że nieprzypadkowo te klasy trafiły do Springa - we większości projektów opartych na tym frameworku, które widziałem do tej pory na oczy, występuje dao dla ORM oraz JDBC. Wynika to z tego, że część operacji po prostu nie jest przepychana przez narzędzia mapujące a przez zapytania. Powiedzmy, spore partie danych są wrzucane przez masowe inserty, ponieważ użycie zasobów przez ORM zabiło by serwer aplikacyjny.

Podobnie moi drodzy ma się sprawa z naszymi przyszłymi projektami. Warto sobie budować "core", który bezproblemowo przechodzi z jednego projektu do drugiego by w przyszłości zaoszczędzić czas. Pojawił się tu temat Springa - jest to narzędzie bardzo popularne wśród developerów Javy, momentami aż za bardzo, aczkolwiek skala jego wykorzystania wynika z tego, że jest on bardzo łatwy w adaptacji. Gdy dobrze skonstruujesz sobie abstrakcję przy DAO będziesz mógł je użyć wszędzie - niezależnie od projektu i użytych bibliotek.
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: 19.09.2025 - 10:29