… czyli subiektywny przegląd frameworków
Dawno nic nie pisałem, a to (standardowo) ze względu na masę pracy: troche zleceń, trochę własnej roboty. Właśnie z powodu małej ilości czasu zainteresowałem się gotowymi frameworkami w PHP. Wprawdzie jakiś czas temu zacząłem pisać coś swojego (oparte na PDO i OPT) ale wiele z tego nie wyszło. Raz: nie posiadam odpowiednio sporej wiedzy aby napisać to porządnie, a dwa: nie da się tego napisać szybko.
Przegląd frameworków zrobiłem jakis czas temu (nawet wtedy z cakePHP pożyczyłem sobie bardzo fajną obsługę sesji) ale wtedy ostatecznie nic nie wybrałem ze względu na dosyć specyficzne wymagania. Tym razem na lekturę różnych opracowań i poszczególnych dokumentacji poświęciłem kilka dni. Z listy 10 PHPowych frameworków wybrałem 3 które mi się spodobały i o których słyszałem najwięcej tj. cakePHP, Code Igniter i Symfony.
Na pierwszy ogień poszło Symfony, które ma najlepiej zorganizowaną stronę, dokumentację, screencasty oraz tutorial jak w 24 dni zrobiono dwazerowy serwis askeet. Niestety, okazało się, że Symfony to jednocześnie najbardziej zamieszany framework, z masą katalogów i setkami plików. Konfiguracja tego to jakaś udręka, a pisanie pytań sql w XMLu to chyba zaprzeczenie istoty upraszczania. W ogóle Symfony wygląda na projekt jakiegoś teoretyka co to się lubuje w MVC, OO, wsadzaniu wszystkiego w XML i yml oraz konfigurowaniu każdej najdrobiejszej rzeczy. Po przeczytaniu kilkuset komentarzy mogę powiedzieć, że to jest chyba jedyny framework który ma tyle samo zwoleników co przeciwników
Mimo wszystko pobrałem paczkę z Symfony i chciałem napisać prostą aplikacje z kilkoma akcjami. Niestety, pomimo obszernej dokumentacji szło mi bardzo opornie. Framework jest cięzki w zrozumieniu, momentami mało logiczy i zawiły w nazewnictwie (ha, są osoby, które to wychwalają:)). I tym sposobem Symfony poszło na śmietnik: za trudne dla mnie, zawiłe, ciężkie, ogromne, z tysiącem plików, wymagające sporo czasu aby je opanować.
Następnie wrzuciłem na warsztat cakePHP. „Kejka” pobieżnie przeglądałem kilka miesięcy temu poszukując w nim RoR’owego (Ruby on Rails) natchnienia i owej obsługi sesji. W przeciwieństwie do Symfony „kejk” ma logicznie uporządkowana strukturę katalogów/plików, nie zajmuje ogromu miejsca oraz jest „ready to use” w zasadzie bez konfiguracji. Dokumentacja dość dobra chociaż brak tak dokładncyh tutoriali jak w przypadku Symfony. Za to samo pisanie w cakePHP jest bardzo proste i intuicyjne. Bardzo szybko załapałem styl pisania i zrozumiałem co i jak. cakePHP ma tez mase różnych przydatnych dodatków (‘helpery’) oraz przepięknie wbudowaną obsługę AJAXa (korzysta z Prototype). Niestety nie ma rzeczy idealnych: strasznie wkurzył mnie sposób obsługi baz danych (CRUD, active record czy jak to się tam zwie). Może się nie znam, ale dla mnie to nie jest żadne ułatwienie, a wręcz przeciwnie – koszmarne utrudnienie. Co z tego, że pobranie rekordów załatwia mi jedno $this->findAll(); skoro raz: fatalnie to wpływa na wydajność (powiązania na kilku tabelach, zabawa z recursive), dwa: przy powiązaniach i tak trzeba się napisać jak wariat -> w każdym modelu zdefiniować hasMany, belongsTo, hasManyAndBelongs itd. a do tego dopisać sporo opcji z typem pół tabeli. Może jestem wstecznikiem ale dla mnie takie „ułatwienie” to porażka
Lubie mieć całkowitą kontrolę nad zadawaniem pytań bazie, a napisanie kilkulinijkowego zapytania jest dla mnie szybsze i logiczniejsze niż zabawa w kilkunastu plikach i definiowaniu wszystkiego. CakePHP też nie ma szablonów w dosłownym tego słowa rozumieniu. Na szczęście nie stanowi to jakiegoś sporego problemu.
Na koniec rzuciłem jeszcze okiem na Code Ignitera. Tam spodobało mi się „normalne” obsługiwanie baz oraz prosty system szablonów. Do tego CI ma w standardzie bardzo przydatne komponenty jak: obsługa wysyłki emaili, uploadu plików, podział wyników na strony (paginate) czy trackback. Mimo wszystko zostałem przy cakePHP.
Oczywiście proszę tego wpisu nie traktować jako recenzji tych frameworków (a tym bardziej rzetelnej lub obiektywnej:)), to tylko kilka zdań, luźnych moich przemysleń na ten temat. Każdy z nas ma swoje dosyć specyficzne potrzeby i to co dla jednego jest ułatwieniem (vide ten active record) to dla drugiego (czyli np. mnie) jest zmorą
W tej chwili piszę pierwszą aplikacje w cakePHP i jak tylko skończę to dam znać czy ten framework sprawdził się w praktyce. Na pewno moge napisać, że w ‘kejku’ pisze się bardzo przyjemnie, a masa dodatków niesamowicie ułatwia życie. Nie wyobrażam sobie teraz pisania np. obsługi walidacji formularzy kiedy to w ‘kejku’ robie var $pole = alfanumeryczne i już, sprawa załatwiona. To samo z obróbką danych wejściowych czy ‘wypluwaniem’ różnego rodzaju danych. Update danych via AJAX to też zaledwie kilka linijek. Żyć nie umierać. W tej chwili największa wadą jest to, że trzeba się tego frameworka najpierw nauczyć: manual cały czas otworzony i gotowy na poszukiwania czy jest taka i owaka funkcja
Dobrze, że przynajmniej wszystko jest dosyć proste i logiczne.
A jak ktoś chce poczytać juz na poważnie i z szczegółami co oferuje dany framework i jakie ma wady to zapraszam do moich zakładek na delicjach. Przez tych kilkanaście dni zgromadziłem na prawdę sporo ciekawych linków do róznych opracowań, recenzji i porównań.
http://del.icio.us/normanos
http://www.snook.ca/archives/php/cakephp_is_it_w_1/
i bardzo ciekawe opracowanie z uwzględnieniem plusów i minusów: Rails-inspired PHP frameworks. Szczególnie polecam ten link.
ps. a zaraz pewnie przyjdzie Splatch i powie, że cakePHP ma śmieciowy kod











Tylko rzuciłem okiem na tekst i już widzę „pisanie pytań sql w XMLu to chyba zaprzeczenie istoty upraszczania” (na temat Symfony)
I tu moje pytanie? Ty na pewno piszesz o Symfony?
Nie iwdziałem tam takich rzeczy nigdzie.
Będę musiał to przeczytać w domu i sprostować bo coś czuje że jest więcej takich bzdur w tym tekście.
Trudno mi się zgodzić z Twoim zdaniem co do Symfony. Po kolei:
Jakie pisanie pytań w XML?! W XMLu opisujesz strukturę bazy danych, ale absolutnie nie musisz robić tego ręcznie.
$ symfony propel-build-schemaI masz opis bazy
$ symfony propel-build-modeli masz wygenerowane klasy.
Fakt, sporo yamla w symfony jest. Ale nie musisz wszystkiego konfigurować. Dla mnie budowa symfony jest prosta i logiczna jak konstrukcja cepa.
Wcześniej przez rok korzystałem z Mojavi oraz Propela a Symfony to połączenie pierwszego i drugiego.
Możesz rozwinąć, co jest nielogicznego i zawiłego w nazewnictwie?
@mike_mech: przyszedłeś się wyżyć?
Prostuj do woli. Może komuś się przyda.
@splatch: NIE odpowiada mi wszystko w symfony, zupełnie wszystko. Generowanie tego wszystkiego tez mi nie pasuje, ani zabawna z yamlem.
To po prostu NIE jest fm dla MNIE. Symfony ma tyle samo zwolenników co przeciwników, ja należe do tych drugich.
W cakePHP znalazłem zupełne przeciwieństwo symfony i już przy nim zostałem. Pisze mi się w tym szybko i przyjemnie a spore forum pomaga w problemach.
Martwie się tylko tym, że cakePHP wydaje mi się być trochę powolne :/ Zobaczymy jak nowy projekt będzie się na tym sprawował.
Nie przyszełem się wyżywać.
Rozumiem doskonale że są fani jednego i drugiego frameworka i tak jak Ty lubisz cakePHP ja lubię Symfony.
Ale w związku z tym że publikujesz jakieś informacje na temat Symfony to dobrze by było gdyby nie były wyssane z palca i nie odstraszały ludzi, bo potem będę łazić i powtarzać.
To prostuj waść, prostuj. Przeciez ja nie mam nic przeciwko
ba, z chęcią poczytam i zostanie dla potomnych
Tylko oszczędź nam tego pretensjonalnego tonu i skup się na konkretach
Co do CakePHP – zdaje się ze Model ma metodę query(), która umożliwia wykonanie dowolnego zapytania SQL (czyt. własnego).
Chociaż z obsługą tabel w bazie danych są przejścia, łatwo się do tego przyzwyczaić, i po chwili to ułatwia prace (mi to zajęło bodajże 2 dni na przekonanie się do „CRUD, active record czy jak to się tam zwie”
a mi nie i spokojnie używam query z cache i jestem zadowolony
Podczas dzisiejszych przenosin serwisu z easyisp na progreso stracił się jeden komentarz. Autor anonim wybąkał coś w stylu „nie masz zielonego pojęcia o symfony”. True. Symfony jest zakręcone jak słoik ogórków na zimę
W tym czasie obczaiłem cakePHP i już prawie ukończyłem pierwszy serwis na nim czyli framework zdał egzamin
Normanos : cake to dobry „fm” jeżeli chesz napisać bloga ( 3 tabele , miedzy dwiema relacja 1:n ) w 5 minut ( raczej w 5 dni
.
Dokumentacja do cake’a prawie żadna, zwykle niekatulane totki, jedyne na czym można polegać to API ( ale i tak nie do końca – brak komentow przy niektórych metodach, lub komenty skopiowane ze starszych wersji klas, metod, funkcji). Korzystanie z API było by ok, ale mówimy o sofcie RAD, brniecie przez API, porównywanie go ze źródłami szukanie cudzych rozwiązań na google groups ( te są często prowizorkami – jak np obsługa kilku kluczy obcych przez dodanie kolejnej ascocacji z inna nazwa klucza – co w rezultacie daje kolejne parsowanie modelu ( i nie tylko ), 20 – 30 takich zwodów i serwer przy dużym obciążeniu powie papa )…. to już o czymś świadczy.
U mnie cake wymiękł przy projekcie złożonym z około 60 tabel ( wszystkie możliwe relacje, często z jednej tabeli do 2 , potem do 3, 4, 5 itd ) – to pierwsza baza, jakieś 40 tabel druga ( tworzona wraz zakładaniem nowego konta klienckiego ).
Bazy są przelanczane dynamicznie tzn polaczenie do mniejszej bazy ( 40 tabel ) ma wiele powiedzmy 40 kopii ( roznia sie dane ) .
W jeden z glownych modeli ma okolo 15 asocjacji ( relacji – wszelkie mozliwe typy ). Wystarczy sobie zrobic w owym modelu czy kontrolerze tego modelu pr( $this ) – zajmuje to jakies 6 – 8mb ( cake sie zapetla i prasuje ten sam model wiele razy, czyta wszelkie mozliwe dane lacznie z typem kolumn, i dlugoscia pola itp itd) , po calkowitym usunieciu asocjacji – 600 kb.
Zakladam ze ktorys z userow bedzie zlosliwy i wcisnie pod IE F5 i bedzie go trzymac ….. po 10 sekundach takich zabaw obciazenie BD – 100%, po 15 mysql wywala blad – limit polaczen przekroczony ( jakies 1000 polaczen – to na lokolanym serwerze )
Chyba znow to oczyms swiadczy…..
Walidacja modelu – dziala , ale tylko niektore metody. Walidacja danych z dwoch modeli wyslanych z jednego formularza …. dziala tylko dla „glownego” modelu, drugi jest zapisywany zawsze ( np User i UserProfile ) – mozemy dostac usera bez profilu, lub profil bez usera
Chyba znow to oczyms swiadczy…..
Po roku pracy z cakiem , kory sie okazal czasem zmarnowanym ( co mnie obchodzi ze cos kiedys bedzie dzialac – nie dziala wlasnie teraz lub dziala w sposob nieprzewidywalny ) Z cake’a uzywam jedynej funkcjonalnosci jaka w nim dziala …..
Zamiast frameworka mam teraz 5mb formHelpera ( bo jak inaczej nazwac framework wykastrowany z doslownie wszytskiego ) .
Coz nie ja wybieralem ten prawie framework na baze dla aplikacji ktora pisze, ale na pewno nigdy wiecej z niego nie skorzytam.
Sorry za gramy, orty, itp po 12 godzinnym dniu pracy kazdemu sie moze zdazyc