Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Integracja z innym skryptem + MVC
-lukasamd-
post
Post #1





Goście







Witam,
mam własny skrypt zintegrowany z forum na phpBB3, postanowiłem przerobić go aby był bardziej przenośny i mógł posłużyć do tworzenia innych serwisów dopiętych do for tego typu.
Wszystko było na funkcjach i strukturalnie, postanowiłem zamknąć ile się da w OOP, przez przypadek wyszło że warto od razu wszystko odseparować.

Skrypt ma przyjazne adresy, lecz nie mam żadnego routera, bo faktycznie zajmuje się tym .htaccess. Nie mam zamiaru puszczać wszystkich żądań (np. takich, które zwracają 404) na jeden plik. Są określone moduły i nie ma problemu aby wypisać je w htaccesie, wszystkie wymienione będą jednak iść przez główny plik.

Wygląda on obecnie tak:

  1. define('IN_PHPBB', true);
  2.  
  3. require_once 'core.php';
  4.  
  5. $module = request_var('module', '');
  6. if (!array_key_exists($module, $modules))
  7. {
  8. $module = 'news';
  9. }
  10.  
  11. $view = loader::view($modules[$module]['view']);
  12. $view->model = loader::model($modules[$module]['model']);
  13. $view->model->db = $db; // obsluga bazy danych z phpbb3
  14. $view->urls = new urls(true); // Osobna klasa sluzaca do budowy linkow przyjaznych lub zwyklych
  15.  
  16.  
  17. include DIR_MODULES . $module . '.php';


W pliku core.php są wykonywane takie operacje:
- includowanie głównych plików phpBB3
- start sesji (obiekt $user)
- dołączenie podstawowych stałych i klas


Jest to pierwsza moja zabawa w OOP+MVC i to chyba niestety widać.
Tworzony widok rozszerza klasę bazową, podobnie jest z modelem (klasy te posiadają metody, które są potrzebne we wszystkich modułach).
Sięgnąłem do odpowiedniej lektury i wynika z niej, że to widok ma odwoływać się do modelu. Uznałem więc, że najlepiej będzie zrobić właśnie tak - obiekt modelu jako część widoku.
Includowany na sam koniec moduł można by uznać za "pseudo-kontrolery", które mają np. taką zawartość:

  1. $id = request_var('id', 0);
  2.  
  3. if (!$id)
  4. {
  5. $view->urls->zeroDuplicate('index');
  6.  
  7. $countNews = $view->model->countNews();
  8. $news = $view->model->getNewsByPage();
  9.  
  10. while ($row = $db->sql_fetchrow($news)) //#1
  11. {
  12. $view->renderNews($row);
  13. }
  14. $db->sql_freeresult($news);
  15.  
  16. $view->urls->generatePagination($page, $config['portal_news_display'], $countNews, 3, '', 'index');
  17. }
  18. else
  19. {
  20. $news = $view->model->getNewsById($id);
  21.  
  22. if (!$news) die();
  23. $view->urls->zeroDuplicate('news', $news);
  24. $view->model->updateNewsReadsById($id);
  25.  
  26. $view->renderNews($news);
  27. }
  28.  
  29. $view->renderPage();


Jak widać, tak naprawdę w nich z modelu do widoku trafiają dane, które są potrzebne. Wg. tego co czytałem, kontroler nie powinien zachowywać się jako taki pośrednik, więc coś tu nie gra. Poza tym fragment który zaznaczyłem jako #1 - czy to ma sens leżeć w takim miejscu? Nawet gdyby to było w widoku, jakoś nie pasuje. Wydaje mi się, że powinienem poprzez model zwrócić tutaj gotową tablicę z danymi a nie uchwyt do wyniku zapytania, no ale pewności nie mam.

Kolejna rzecz, w bazowej klasie modelu mam metodę getPanels, która ma za zadanie pobrać zawartość sidebara na stronie na potrzeby metody renderPage klasy bazowej widoku. Najlepiej aby pobrane dane od razu zostały zawartością widoku. Niestety przy takiej konstrukcji dostęp do jego właściwości mam dopiero po użyciu słowa kluczowego global, a to już jest chyba zupełnie bez sensu. Nie mam natomiast pojęcia jak metoda modelu mogłaby się odwołać do właściwości widoku (o ile to nie jest równie bez sensu, bo chyba powinien zwracać wyniki zamiast modyfikować widok, z tym że zastanawiam się nad tym po co 2 razy te same dane trzymać). Tak samo wygląda zresztą sprawa z obiektami które daje mi do dyspozycji phpBB3 - muszę używać global. No chyba że by je przypisać do tych moich obiektów, bo o ile dobrze rozumiem, bez użycia słowa clone nie będę tutaj niczego marnotrawił (tak z głównym pliku wygląda sprawa z $db).

Nie wiem również, czy zamykać i to i to w obiekcie kontrolera (tworzony z modułu + bazowy) czyli np.:
  1. $controller->view = loader::view($modules[$module]['view']);
  2. $controller->model = loader::model($modules[$module]['model']);


Z tym, że jeżeli przeniosę zapytania z modelu do widoków, to albo używam global, albo będą one wyglądać raczej tak:

  1. $news = parent::model->getNewsById($id);


Czyli znowu kontroler robi się pośrednikiem pomiędzy widokiem a modelem...

Ten post edytował lukasamd 10.02.2011, 16:34:54
Go to the top of the page
+Quote Post

Posty w temacie
- lukasamd   Integracja z innym skryptem + MVC   10.02.2011, 16:21:13
- - Zyx   Masz rację, zwracanie uchwytu do zapytania to nien...   11.02.2011, 08:26:13
- - lukasamd   No tak, ale wstyd byłoby go nie znać, a bez prakty...   11.02.2011, 10:14:38


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: 7.10.2025 - 05:31