Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [jądro]System aukcyjny
Forum PHP.pl > Forum > PHP > Pro > Archiwum Pro
splatch
Właśnie zaczynam pisać jajko dla systemu aukcyjnego. Jestem świadom tego, że serwis będzie obciążony i dlatego chcę możliwie najlepiej rozwiązać kwestię jądra. Przy wcześniejszych projektach używałem silnika napisanego strukturalnie podpartego smarty.

Chcę stworzyć główną klasę 'VenteSystem', która będzie odpowiedzialna za połączenie z bazą danych oraz załadowanie error handlera i smarty.
Jej kod wygląda tak:
  1. <?php
  2.  
  3. define( 'LIB_DIR', 'F:/www/localhost/libs/' );
  4.  
  5. class VenteSystem
  6. {
  7. function VenteSystem( )
  8. {
  9. echo &#092;"[system]Laduje potrzebne biblioteki<br>\";
  10.  
  11. require_once LIB_DIR .'smarty/Smarty.class.php';
  12. require_once LIB_DIR .'driver/mysql.php'; // w przyszlosci dodanie wyboru mysql/pgsql
  13. require_once LIB_DIR .'error_handler.php'; //sam ustawia sie jako domyslny
  14.  
  15. $this->smarty = & new Smarty;
  16. $this->db = & new sql_db('localhost', 'splatch', 'splatch', 'splatch');
  17. }
  18.  
  19. function VenteOutput( )
  20. {
  21. echo &#092;"[system]Pokazuje gotowa strone<br>\";
  22. $this->VenteDie( );
  23. //return $this->smarty ? $this->smarty->display( 'index.tpl' ) : '';
  24. }
  25.  
  26. function VenteDie( )
  27. {
  28. $this->db->close( );
  29. echo &#092;"[system]Zamykam polaczenia z baza<br>\";
  30. }
  31. }
  32.  
  33. ?>


Teraz w kodzie strony głównej mam
  1. <?php
  2. $system = new VenteSystem( );
  3.  
  4. echo &#092;"..sprawdzam url..<br>\";
  5. switch( $_GET['action'] )
  6. {
  7. case 'auction':
  8. echo &#092;"..laduje dane o auckji..<br>\";
  9. include 'modules/auction.php'; //wczytuje klase auction
  10. $object = new auction( $system );
  11. $object->parse(); //dodanie do szablonu
  12. break;
  13. default:
  14. echo &#092;"<b>nieznana akcja<b>\";
  15. break;
  16. }
  17. echo &#092;"..zamykanie polaczenia z baza danych..<br>\";
  18. $system->db->close( );
  19. $system->VenteOutput( );
  20. ?>


Kod klasy auction wygląda tak:
  1. <?php
  2.  
  3. class auction
  4. {
  5. function auction( &$object )
  6. {
  7. $this->system = $object;
  8.  
  9. echo &#092;"[auction]Do konstruktora przekazana zostala kopia obiektu VenteSytem<br>\";
  10. if( !empty( $_GET['id'] ) )
  11. {
  12. echo &#092;"[auction]Pobierz dane o aukcji nr \". $_GET['id'] .\"<br>\";
  13. }
  14. else
  15. {
  16. echo &#092;"[auction]Pobierz liste auckji<br>\";
  17. }
  18. }
  19.  
  20. function parse( )
  21. {
  22. echo &#092;"[auction]Przygotuj do wyswietlenia<br>\";
  23. //$this->system->smarty->assign( 'mainpage', 'tresc' );
  24. }
  25. }
  26.  
  27. ?>


Całość (oprócz administracji) będzie obsługiwana przez stronę główną przy użyciu mod_rewrite. Serwer jest tak skonfigurowany, że url powinen być w postaci: vente.pl/wyraz/liczba[/dodatkowe parametry].
Nie jestem pewien czy takie rozwiązanie jest poprawne. Oczywiście nie byłoby problemu z przerobieniem switch na if( file_exists() ), dodania. Czy wszystko ma realizować jądro.

Czekam na Wasze opinie i rady, za każdą będę wdzięczny.
DeyV
nbie chce mi sę teraz wiecej pisać - dlatego powiem tylko:

wielkim switchom mówimy NIE.

odpowiedzią jest MVC
splatch
Pisałem przecież, że można zastąpić switch warunkiem

  1. <?php
  2. $fname = 'modules/'. $_GET['action'] .'.php';
  3. $cname = $_GET['action'];
  4. if( file_exists( $fname ) )
  5. {
  6. include_once( $fname );
  7. $object = new $cname();
  8. $object->parse();
  9. }
  10. else
  11. {
  12. //nieznana akcja
  13. }
  14. ?>
dag
Cytat(splatch @ 2004-10-20 20:13:47)
Pisałem przecież, że można zastąpić switch warunkiem

A nie lepiej zrobić wszystko według wzorca MVC tak jak pisał DeyV?? Będzie łatwiej tym zarządzać, bo podejrzewam, że system będzie sporawy.
splatch
A co w tym projekcie jest niezgodne z MVC? Jest kontroler, jest akcja i jest widok (smarty). Teraz zostaje tylko kwestia odpowiedniego połączenia modułów, o tym niestety nie napisaliście. Pisanie, żeby skorzystać z wzorca bez dania przykładu nic mi nie daje. Znam tylko podstawy MVC i staram się to na tej zasadzie zrobić, chociaż mogę mylić pojęcia..
dag
Wprowadzenie do MVC - php.pl

Przeczytaj dokładnie.
splatch
Czytałem ten tekst, szukałem na forum i ostatecznie uciekłem się do pomocy starego znajomego (dzięki bora smile.gif ). Wyjaśnił mi nieco zasady MVC i przy jego pomocy napisałem nowy szkielet, co prawda nie jest to nic specjalnego, ale jest. Oto nowy kod, jeśli widzicie w nim jakieś błędy poza złym użyciem :: to piszcie winksmiley.jpg.

  1. <?php
  2.  
  3. class controll
  4. {
  5. var $access = array(
  6. 'home page' => 'all',
  7. 'view auction' => 'all',
  8. 'auction' => 'users',
  9. 'account' => 'user',
  10.  );
  11.  
  12. function controll( $page = null )
  13. {
  14. $this->page = $page;
  15. out( &#092;"uruchamianie kontrolera\" );
  16. if( $page === null )
  17. {
  18. return true;
  19. }
  20. else
  21. {
  22. return $this->access( $page );
  23. }
  24. }
  25.  
  26. function access( $page )
  27. {
  28. out( &#092;"sprawdzam prawa uzytkownika\" );
  29. $status = $_SESSION['status'];
  30.  
  31. if( $this->acess[ $page ] == 'all' )
  32. {
  33. $this->authorized = true;
  34. }
  35. else
  36. {
  37. if( $status == 'u' && $this->access[ $page ] == 'users' ) 
  38. {
  39. $this->authorized = true;
  40. }
  41. else
  42. {
  43. //sprawdz dokladne uprawnienia usera
  44. $this->authorized = true;
  45. }
  46. }
  47. }
  48.  
  49. function run( )
  50. {
  51. out( &#092;"teraz uruchamiam akcje\" );
  52. if( $this->authorized )
  53. {
  54. $action = init::action( $this->page );
  55. $view = $action->run( );
  56. $action->_die( );
  57. }
  58. out( &#092;"mam widok!\" );
  59. }
  60.  
  61. function display( )
  62. {
  63. out( &#092;"wyswietlam widok\" );
  64. }
  65.  
  66. function _die( )
  67. {
  68. out( &#092;"niszcze obiekt\" );
  69. //zamkniecie polaczen z baza itp.
  70. }
  71. }
  72.  
  73. class init
  74. {
  75. function action( $what )
  76. {
  77. out( 'tworze obiekt auction' );
  78. return new auction();
  79. }
  80. }
  81.  
  82. class auction
  83. {
  84. function auction( )
  85. {
  86. out( &#092;"uruchamiam akcje 'auction'\" );
  87. }
  88.  
  89. function run( )
  90. {
  91. out( &#092;"pobieram dane poprzez model i przekazuje do widoku\" );
  92. }
  93.  
  94. function _die( )
  95. {
  96. out( &#092;"niszcze obiekt\" );
  97. }
  98. }
  99.  
  100. class model
  101. {
  102. //tutaj ogolne metody dla modeli
  103. }
  104.  
  105. class auction_model extends model
  106. {
  107. // model tylko do obslugi aukcji
  108. }
  109.  
  110. class view
  111. {
  112. //ogolne metody dla widokow
  113. }
  114.  
  115. class auction_view extends view
  116. {
  117. //metody unikalne, tylko dla aukcji
  118. }
  119.  
  120. function out( $msg )
  121. {
  122. echo $msg .&#092;"n<br>\";
  123. }
  124.  
  125. $controll = new controll( 'home page' );
  126. $controll->run( );
  127. $controll->display( );
  128. $controll->_die( );
  129.  
  130. ?>
dag
Powinno być raczej $Controller a nie $controll ;-). Ja to troszkę inaczej skonstruowałem.
bela
@dag: nie chwal sie, tylko powiedz jak
splatch
Dlatego mnie wkurza to forum - są odpowiedzi, czasami nawet dużo, ale 0 konkretów. Pytam o opinie i rady. Dostaje w odpowiedzi switchom wielkim nie i skierowanie do MVC, przedstawiam kod oparty o wcześniej wspomiany wzorzec i co dostaje w odpowiedzi.. ? Jak narazie "Ja to troszkę inaczej skonstruowałem." dry.gif
DeyV
spokojnie - nie stresuj się - szkoda serca. (a o zdrowie trzeba dbać..)

Co do twojego pomysłu - uważam że idziesz w dobrym kierunku, co zaowocuje mechanizmem znacznie elastyczniejszym i przenośnym, niż switch.
Proponowałbym tylko, by odrazu zaimplementować w nim 2 dodatkowe mechanizmy.
1. to wyciąganie odpowiedniego pliku z klasą akcji, i dopiero wtedy uruchamianie jej.

Oznacza to, że w kodzie
  1. <?
  2.  function action( $what )
  3. {
  4. out( 'tworze obiekt auction' );
  5. return new auction();
  6. }?>

nazwa uruchamianej akcji będzie musiała być podawana dynamicznie, po uprzednim przekonaniu się, czy odpowiedni plik i wybrana klasa istnieją.


2. dopisanie tzw. routera, czyli mechanizmu potrafiącego rozpoznać i zwrócić informacje o tym, jaką akcje chce użytkownik.

Dodatkowo - pisząc w oparciu o MVC warto zachować się dokładnie do zaleceń, i np. nie pozwalać sobie nigdy na pracę z bazą danych poza modelem, a do Requesta odwoływac się tylko w akcjach.
Zapewnia to znacznie bezpieczniejszy i łatwiejszy do utrzymania kod.
dag
Nie mogłem znaleźć aktualnego projektu w UML, więc dam "trochę" CHAOTYCZNĄ wersję.

Wprowadziłem template. Jest to pierwsza faza jego projektowania więc jest mocno uogólniony.

image ~60 KB - 1306x876px

to samo co wyżej, tylko ~37 KB - 1000x671px

PS. Przepraszam za ten projekt, jest MOCNO niezgodny ze standardami UML, ale innego w tej chwili nie mam.

Eh, aż sam się dziwię, że coś rozumiem z tego wykresu ;-) podąrzajcie za strzałkami, jeśli jest <<extends>> to nie musi się zawsze tego wykonywać.

Co sądzicie?
bela
@dag: a gorzej już się nie dało narysować winksmiley.jpg ?
dag
Zaraz przerysuje ;-) Pisałem, że to jest stare i chaotyczne...

EDIT:

MVC
NuLL
Ja odnosze wrazenie - ze mamy tu dyskusje o MVC - z drugiej strony odnosze wrazenie ze pisanie systemu aukcyjnego jest podobne do systemu zarzadzania trescia tyle ze iwkeszej ilosci powiazan - idee co do podstaw jadra sa chyba takie same. Piszemy inne moduly, troche wicej powiazan i tyle.
dag
Heh nie zrozumieliśmy się.

Chodzi o to, że radzę Ci zrobić system aukcyjny w oparciu o framework zgodny ze wzorem MVC.

Wtedy tylko robisz widoki, modele i akcje odpowiedzialne za aukcje. Potem dorabiasz tak samo CMS i masz gotowy i dość łatwy w utrzymaniu kod.
splatch
Poprawiłem nieco całość. Za jakiś czas wrzucę schemat ralacji.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.