cakePHP… 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 :D