Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [własny fw] Budowa framework'a
Forum PHP.pl > Forum > PHP
b'LLy
Witam panowie.
Od niedawna piszę własnego framework'a w PHP5. Wiem, że [może] rzucam się z motyką na Słońce itp. Ale jak na razie całkiem nieźle mi to idzie. Mam jednak kilka wątpliwości, więc proszę doświadczonych wyżeraczy o opinię.
Pierwsza sprawa to co robi: dispatcher, FrontController, router i bootstrap?
Żeby nie było, że nie szukałem i zadaje durne pytania napiszę, jak ja rozumiem filozofię działania frameworka, a wy [jeśli będzie taka potrzeba] sprostujecie moją wypowiedź biggrin.gif
Każde zapytanie kierowane jest przez modrewrite do frontcontrellera, który ustala ścieżki, i ustawia config, na końcu uruchamai Bootstrap. Ten z kolei inicjuje jądro frameworka, includuje najważniejsze klasy, tworzy kontekst. Następnie uruchamia dispacher. Dispatcher wysyła zapytanie do routera, który zwraca kontrolera, metodę i parametry. [...]
Czy tak zbudowany framework ma dobrą strukturę?
ayeo
Witam!

Jak Ci taka pasuje to ma dobrą. To Ty będziesz używał tego FW więc sam powinieneś ocenić czy odpowiadać Ci będzie takie rozwiązanie. Jednak jeżeli chodzi o mnie to widzę to dużo prościej. Główny kontroler odbiera żądanie, includuje potrzebne klasy i funkcje (dao, router, config, auth, session, template). Następnie przekazujemy (na podstawie danych z urla) pałeczkę odpowiedniemu kontrolerowi (jakaś metoda w jakiejś klasie np www.serwis/user/id/13 - stworzenie obiektu UserController, wywołanie metody id(13) winksmiley.jpg . Tam już ustawiamy konkretny szablon, pobieramy dane itd, przetwarzamy je. No i na koniec szablonik je wyświetla...

Pozdrawiam!


// temat przenoszę na PHP
bim2
Tak jak powiedział Ayeo. FrontController to taki co zarządza sobie wszystkim tzn. pobiera dane z routera (co uruchomić etc), confingi itd. Controllery (ja nazwałem sobie je akcjami) służą do wywołania odpowiedniego Modelu i Widoku.
  1. <?php
  2. class Action_Index {
  3. public function _default()
  4. {
  5.  $aNews = $this->modelNews('getAllNews', 5); //pobierze mi 5 newsow
  6.  $this->viewNews('showNews', $aNews);
  7.  
  8.  $this->view('showStaticPage'); //tutaj moze byc co chcesz, to tylk przyklad
  9. }
  10. }
  11. ?>


Router ma odebrac adres url i przerobić go na formę zjadalną. U mnie dostaję adres typu www.test.pl/Action/zmienna.value/zmienna1.value1/Model.html i trzeba go przerobić. Router także tworzy adres.
b'LLy
W takim razie jaką rolę odgrywa dispatcher skoro router przetwarza URL? biggrin.gif Tak samo Bootstrap i FrontController wydają mi się (po przeczytaniu Waszych wypowiedzi) różnymi nazwami tej samej rzeczy.
Chciałbym, aby mój FW był zgodny z wzorcami projektowania, a takie rzeczy jak FrontController zaliczane do grupy design patterns. Więc raczej nie mogę zrobić sobie tego jak mi się podoba. Poza tym nie będę sam w nim pisał ;D
Mam jeszcze kilka pytań.
Wiele pisze się o tym, że singletony "są złe". Chciałem aby context w mojej aplikacji był właśnie singletonem, bo context przy pojedynczym wywołaniu jest jeden i więcej jego instancji nie będzie winksmiley.jpg . Ale z tego co wiem to singletony łamią zasadę hermetyzacji, zawartą w OOP. Z drugiej strony jednak bez użycia singletona pojedynczą instancję klasy App (czy też Context) będę musiał trzymać w zmiennych klas, co mniej mnie rajcuje tongue.gif IMO context powinien być dostępny wszędzie tym bardziej, że zamierzam w nim trzymać cały config. Co o tym myślicie?
Kolejna kwestia to kompatybilność fw z PHP w wersji 4. Myślicie, że opłaca się jeszcze pisać aplikacje pod czwórkę. CakePHP jest napisany właśnie pod czwartą wersję. Skoro tak dobry fw jest napisany w PHP4 to jego developerzy musieli mieć jakieś powody. Pytanie - jakie? Czwórka już dawno wyszła z użycia.
No i ostatnia sprawa - wydajność. Zamierzam użyć bardzo skomplikowanego [ale za to bardzo dobrego, IMHO ofc biggrin.gif ] systemu szablonów - praser xHTML, zmodyfikowany j4p5. Praser systemu generuje kod php, który będzie oczywiście keszowany. Ale nawet zakodowany template używa wielu klas (JavaScript Runtime, praser xml) i jest bardzo pamięciożerny. I tu moje pytanie - czy wydajność FW jest ważną sprawą? Czy opłaca się liczyć na mocne serwery by uzyskać maksimum wygody w kodowaniu szablonów?
Trochę się rozpisałem Oo Ale mam nadzieję, że chętnie odpowiecie na moje głupie pytania tongue.gif
Pozdrawiam.
bim2
Router przesyła jedynie GETy, Dispatcher rozróżnia który to akcja, model itd. Pod 4 nawet nie pisz. Ja używam singletona i jakoś żyję.
pinochet
Co do wydajności biggrin.gif wydaje mi się że nie ma co się martwić ... duże projekty np w C# optymalizuje się pod koniec - sprawdza sie która funkcja najbardziej żre pamięć/procka i przepisuje ją na assembler biggrin.gif
pozatym IMHO może zrób template jako moduł będzie można sobie wybrać j4p5 / smarty / twój autorki
ayeo
Witam!

Wzorce mają Ci pomagać, a nie utrudniać. Jeżeli nie widzisz korzyści płynących z zastosowania konkretnego wzorca to go nie stosuj. FronController służy do tego, żeby każde żądanie przechodziło przez jeden punkt. Dzięki temu w jednym miejscu masz autoryzację, includowanie potrzebnych klas, konfigurację. Możesz zrobić tak jak Ci się podoba - jednak uważam, że podoba Ci się właśnie tak smile.gif

Singletony są uważane za złe bo to niby tylko obiektowa otoczka dla globali. Wszystko zależy od użycia. Dla mnie Singleton ma jedną przewagę nad globalem - globala można nadpisać. Nie widzę nic złego w użyciu Singletona do obsługi np bazy danych.

O php4 zapomnij.

Wydajność jest bardzo ważną sprawą.

Pozdrawiam!
Mize
U mnie Router na podstawie URL, określa controller, akcję oraz parametry. Link w takim wypadku wygląda tak...

Kod
  http://www.example.com/news/comment/1/


Wszystkie zmienne get, post, file i cookie obsługuje obiekt HttpRequest.
FrontController na podstawie danych z Routera uruchamia controller i jego akcję wraz z parametrami.
Akcje to nowe obiekty, nie metody Controllera, ponieważ przy sterowniku z 80 akcjami powstał by zbyt duży chaos.

Co do singletonu, może jest to wygodne ale złe. Masz dostęp do obiektu korzystającego z singletonu praktycznie wszędzie !
martq
Witam, odświeżę temat z racji iż buduje własny zestaw klas i chyba dochodzę do momentu, w którym stwierdzam iż jest to mini framework przystosowany do moich potrzeb smile.gif
Potrzebuję informacji i przykładowego kodu, które pokażą mi współpracę i różnicę między FrontController <->Router <->Dispatcher oraz zawartości pliku index.php. Nie chcę całych rozwiązań lecz jakiegoś wstępu i tylko opisu.. Każdy co innego pisze i już troszkę zgłupiałem smile.gif
marcio
Pod reka nie mam teraz klasy router'a,dispatcher'a ani frontcontroller'a.

Jednak index u mnie wyglada tak:

  1.  
  2. <?php
  3. require_once('frontcontroller/Init.php');
  4.  
  5. $router = Loader::load('Router');
  6.  
  7.  
  8. $core = new Dispatcher();
  9. $core -> Exec($router);
  10.  
  11.  
  12. ?>
  13.  
  14.  


Zasada router'a to interpretacja url'a czyli "ustawienie" kontrolera i akcji do wykonania, oczywiscie tak krotko mowiac.

Dispatcher jak widac pobiera dane od router'a i odpala odpowiedni frontcontroller z odpowiednia akcja.

u mnie tak to dziala.

martq
Pytając jednego użytkownika o Dispatcher i Router dostałem odpowiedz iż te dwie klasy robią praktycznie to samo... Co do Twojego odpalenia:
  1. $core = new Dispatcher();
  2. $core -> Exec($router);

Widziałem przykłady identyczne tylko $core = new FrontController(); $core->Dispatach($router);
No i weź tu człowieku bądź mądry ;p
Mam jeszcze małe pytanko, możesz wyjaśnić jak działa Loader::load('Router'); ?snitch.gif
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.