Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Projektowanie własnego frameworka
Forum PHP.pl > Forum > PHP > Object-oriented programming
PotasK
Ostatnio przymierzam się do napisania własnego frameworka.
Część problemów już rozgryzłem, trochę pewnie pojawi się przy pisaniu, ale nie w tym rzecz.

1. Od czego najlepiej zacząć?
Czy zacząć pisanie od jakiegoś elementu całego systemu, czy też najpierw najlepiej zaprojektować całą podstawową strukturę na papierze? Chodzi mi szczególnie o to, że przy pisaniu może się okazać, że jedna klasa kożysta kolejnej, ta z jeszcze innej, itd. i utworzy się błędne koło, czago chcę uniknąć.

2. Do jakich elementów przywiązać szczególną uwagę?
Planuję zastosować wzorzec MVP (Model-View-Presenter - różni się nieco od MVC). Do tego kombinuję nad jakimś logicznym systemem routingu i obsługiwaniu http request i response, a co za tym idzie URI, parametry URL, itd. Auto-loading chyba oczywisty, konfigurację chcę oprzeć na wzorcu Registry. Na co uważać?

3. Wywoływanie kontrolerów
Przez funkcję call_user_func_array(), "manualnie" przez $obiekt->$metoda(), czy funkcją podobną do call_user_func(), znajdującą się w klasie-rodzicu?

4. Modułowość klas
Chodzi o to, że chcę, aby istniała np. klasa DB, która korzystałaby z innych klas-sterowników dla różnych baz danych, np. mysql, postgresql, czy sqlite.
Czy wczytywać sterowniki przez parametr konstruktora klasy DB, czy też przekazywać je jako obiekty?

5. Namespace i hierarchiczny system plików
Czy to dobry pomysł? Planuję zrobić to tak, że np. klasa znajduje się w katalogu: /base/classes/db/mysql.php i wtedy stosować dla niej namespace db (nazwa katalogu w którym się znajduje). Wydaje mi się, że byłoby to dobrym rozwiązaniem dla auto-loadingu, a może nie?

I to byłoby chyba tyle na tę chwilę. Jeśli będę miał jeszcze więcej pytań, to będę je zadawał w tym temacie, żeby nie śmiecić za bardzo.
Z góry dziękuję za wszystkie odpowiedzi.
redeemer
Nie widzę sensu w tworzeniu własnego frameworka, ale Fabien Potencier (ten od symfony) na swoim blogu zamieścił ciekawy cykl artykułów "Create your own framework... on top of the Symfony2 Components"
usb2.0
poszukaj na blogu Fabiena
@up wyprzedziles mnie:P
PotasK
Cytat(redeemer @ 6.05.2012, 21:29:43 ) *
Nie widzę sensu w tworzeniu własnego frameworka

W moim przypadku ma to charakter głównie czysto edukacyjny smile.gif

Dzięki za linka, poczytam, pokombinuję smile.gif
marcio
Powiem ci tak sam stworzylem ponad 1 rok temu framework(z nazwy) w praktyce no byl to framework ale wiesz teraz to mi sie z niego smiac chce.

Po czym przepisalem wszystko na nowo gdy juz nauczylem lepiej sie OOP w teorii i praktyce(kodzilem dosc duzo roznych rzeczy) poznalem wzorce projektowe i architektoniczne.Teraz projekt sie rozrosl uwazam na jego optymalizajce i bezpieczenstwo uwazajac tez na jego elastycznosc.
Na koniec postawilem na nim CMF ktory stoi na klockach(komponenty/plugin-y/widget-y) i do teraz po przeszlo 4-5 miesiacach w projekcie cos sie zawsze zmienia.

Nie widze nic zlego w napisaniu wlasnego fw ale trzeba miec jakas wiedze na ten temat piszac moj powiem ci szczerze ze dniami przegladalem kody takich fw jak Zend/Sf/Kohana 2.x/3.x/coyote cmf-fw/spawn/codeigniter/yii poznajac django i wiele wiele innych i w PHP tak warto jest napisac swoj poniewaz wedlug mnie poznajac np Django/RoR/Grails/Lift/pylons-pyramid czy inne bardzo ciekawe frameworki ktore jako tako w polsce sa malo popularne ludzia w ogole nie przychodzi do glowy zeby napisac swoj, tylko PHP posiada taki trend bo te co sa w php jak dla mnie sa nudne i nie zachecaja do nauki.

Analizowalem Django/Ror i wybralem django bo znalem podstawy python-a choc nadal znam go slabo bo malo czasu mu poswiecam, i moge ci powiedziec ze piszac w Django(i ogolnie python-ie) nie potrzebujesz nic wiecej, tworzyc zadnych rzeczy poprostu to co jest, jest super(oczywiscie nie w 100%) ale porownujac do php to poprostu miodzio!

To tak teraz wroce na ziemie i do tematu.

Widze ze juz idee jak to powinno wygladac masz, wiece teraz wez sie za kodzenie a wszystko wyjdzie w praniu, analizuj kod innych znanych wszystkim rozwiazan i wyciagaj wnioski od najlepszych!

Ja u siebie np nie mam namespace-ow bo server kumpla ma jeszcze php 5.2.x wiec wiesz wink.gif

Cytat
2. Do jakich elementów przywiązać szczególną uwagę?

Stworz dobry szkielet reszta przyjdzie od siebie!
Czyli Autoloader, response, request, uri, router, dispatcher, widoki i modele i tak generalnie to chyba podstawa!

Ja np nie uzywam call_user_func/call_user_func_array ani nic z podobnych poprostu tworze egzemplaz front controller-a i wywoluje akcje ktora laduje reszte klockow.

Cytat
Czy wczytywać sterowniki przez parametr konstruktora klasy DB, czy też przekazywać je jako obiekty?

To tez duzo zalezy od ciebie jak tobie jest wygodniej mozesz tez wykorzystac np wzorzec strategii lub jakis inny nie ma jednego prawidlowego sposobu, ile programistow tyle sposobow.
Zrob tak by bylo elastycznie ze jak bedziesz chcial miec konfiguracje w PHP,Xml,Csv czy Ini to nie bedzie z tym problemu tak samo jesli chodzi o Bazy danych, i18n,cache czy inne elementy ktore moga dzialac na wiele sposobow.

To takie moje 3 grosze bo moglbym tak pisac bez konca.
!*!
Cytat(PotasK @ 6.05.2012, 21:14:45 ) *
1. Od czego najlepiej zacząć?

Od kartek papieru.

Cytat(PotasK @ 6.05.2012, 21:14:45 ) *
2. Do jakich elementów przywiązać szczególną uwagę?

Do wszytkich.

Cytat(PotasK @ 6.05.2012, 21:14:45 ) *
3. Wywoływanie kontrolerów

Tym zajmuje się router.
Cytat(PotasK @ 6.05.2012, 21:14:45 ) *
4. Modułowość klas
Chodzi o to, że chcę, aby istniała np. klasa DB, która korzystałaby z innych klas-sterowników dla różnych baz danych, np. mysql, postgresql, czy sqlite.
Czy wczytywać sterowniki przez parametr konstruktora klasy DB, czy też przekazywać je jako obiekty?

Dobre na początek, jednak później przy jakiejś rozrośniętej apliakcji nie zda to egzaminu, polecałbym zapoznać się z DBO.

Cytat(PotasK @ 6.05.2012, 21:14:45 ) *
5. Namespace i hierarchiczny system plików
Czy to dobry pomysł? Planuję zrobić to tak, że np. klasa znajduje się w katalogu: /base/classes/db/mysql.php i wtedy stosować dla niej namespace db (nazwa katalogu w którym się znajduje). Wydaje mi się, że byłoby to dobrym rozwiązaniem dla auto-loadingu, a może nie?


PSR-0 zastosuj się do tego standardu i wszytko będzie cacy. Autoloadery rób z użyciem SPL.

Cytat
Nie widzę sensu w tworzeniu własnego frameworka

Dobrze że tylko Ty smile.gif
marcio
Cytat
Tym zajmuje się router.

Router ustawia co i jak a odpalaniem zajmuje sie dispatcher ewentualnie front controller(u mnie tak jest)
Cytat
Dobre na początek, jednak później przy jakiejś rozrośniętej apliakcji nie zda to egzaminu, polecałbym zapoznać się z DBO.

DI tez sie dobrze spisuje
!*!
Cytat(marcio @ 7.05.2012, 15:21:11 ) *
Router ustawia co i jak a odpalaniem zajmuje sie dispatcher ewentualnie front controller(u mnie tak jest)


O ile go masz wink.gif kewstia samej struktury FW... Zresztą tu nie ma złotego środka, rób tak jak Ci wygodniej, bo co z tego że ja Ci podam rozwiązanie X, a ktoś Y.
ShadowD
Kiedyś już miałem podejście do własnego fw. po wielu naprawdę wielu próbach się poddałem, całość problemu polegała na masie zależności gdzie by całość działała w jakimś stopniu trzeba było mieć jakąś część całości, a napisanie takiego ogromu kodu by później to zgrać z sobą i by tak jak u mnie pojawił się wielki problem w postaci "o ***** zapomniałem o ..." i czas przebudować połowę, gdzie po drodze okazało się że mój projekt tego czegoś nie przewidywał, a co za tym idzie trzeba go przebudować - padłem po kilku tygodniach kodzenia i zaczynania od początku, by napisać coś sensownego trzeba by jakieś grono osób i przede wszystkim projekt nad którym spędziło się więcej niż tydzień, a im więcej ogarniętych osób w teamie tym więcej pomysłów na rozwiązanie tego samego problemu - zawsze można wybrać ten najlepszy, a jak się jest samemu nie wpada się od razu na najtrafniejsze rozwiązanie, a przebudowa rozwiązania może ciągnąć zmiany w logice całości gdzie przy takiej kobyle powrót do innego modułu wdrożenie się w własny kod i poprawa tak by nie zepsuć czegoś obok to masochizm jak dla mnie.

Szanuję każdego kto pisze własny fw. osobiście skupiłem się na zend i na razie nie żałuję choć widzę wiele błędów jakie posiada - całe szczęście twórcy prawie wszystkie wychwycili i (albo już zostały napisane od początku lub są w planach do przepisania) w drugiej odsłonie zf.

Życzę Ci powodzenia i pamiętaj że podstawa to projekt w którym przemyślisz każdy szczegół.
PotasK
Dzięki za wszystkie odpowiedzi smile.gif

Zastanawiam się jeszcze nad ładowaniem plików. Napisać własny system, czy skorzystać z jakiegoś gotowca?
!*!
Cytat(PotasK @ 7.05.2012, 18:17:07 ) *
Dzięki za wszystkie odpowiedzi smile.gif

Zastanawiam się jeszcze nad ładowaniem plików. Napisać własny system, czy skorzystać z jakiegoś gotowca?


Jakim ładowaniem i jakich plików? PHP? Pisałem już, od tego jest SPL w PHP. Nie ma tu filozofii więc wszytkie gotowce wyglądają tak samo.
PotasK
Hmm, z tego co wiem, to SPL pozwala tylko na ładowanie plików klas. (Jeśli jest inaczej to mnie oświeć)
Chodzi mi o łądowanie przykładowo plików konfiguracyjnych, zwracających jedynie tablicę, czy też innych plików zewnętrznych, niekompatybilnych z frameworkiem.
!*!
Piszesz odpowiednią klasę która będzie ten plik pobierać a odwołąsz się do niej "config::read('mysql_pass')" co zwróci wartość mysql_pass z tablicy tego pliku.
ShadowD
Zobacz sobie jak to jest w zend zrobione, bardzo ładnie i funkcjonalne - poza tym po właśnie poszperać i popatrzeć jak robią to inni. ;]
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.