Symfony 2: pierwsze wrażenia

Nowości w Symfony 2

  • PHP 5.3 jako standard i korzystanie z przestrzeni nazw
  • Zupełnie nowy kod, zdecydowane odchudzenie klas, czuć lekkość
  • Dependency Injection (IoC)
  • Events
  • Modułowa architektura, nie tylko pod postacią katalogów o nazwie modules/plugin
  • Rezygnacja z pluginów jako mikroaplikacji na rzecz Bundles
  • Źródła hostowane na GitHub

Bundle 1: Marketing

Prezentacje, konferencje, świetny design stron przemawiają za rewolucyjnością nowego produktu SensioLabs.

Faktycznie, w świecie PHP może być to jakaś rewolucja, ale chyba głównie za sprawą samego PHP 5.3 i namespaces zaciągniętych z "szóstki". A źrodła Symfony? Ano jak to PHP - trochę Javy trochę C, np. klasy Request/Response w których zaimplementowano tylko akcesory (powstają obiekty o niezmiennym stanie). W Django najważniejsze middleware opierają się na możliwości modyfikacji obiektu Request dodając np. właściwość user. Proste i dziala. W Symfony 2 to nie przejdzie, ubijany jest dynamizm języka programowania.

Bundle 2: Dependency Injection

Kiedyś bardzo potrzebowałem takiego mechanizmu. Otóż za pomocą konfiguracji (PHP/Yaml/XML/etc) można zdefiniować skonfigurowane usługi pod unikalnymi nazwami. Konfiguracja może odbywać się przez wstrzyknięcie argumentów do konstruktora lub wybranych metod (argumentami mogą być wartości lub odwołania do innych zdefiniowanych usług).

W teorii można swobodnie wymieniać/parametryzować poszczególne instancje klas. W praktyce stosuje się to rzadko lub wcale.

Popełniłem kiedyś taki plugin do Symfony 1.x - sfIocPlugin - wzorowałem się na IoC ze Springa. ''' Dependency Injection w Symfony może przydać się przy większych projektach, gdzie pewne usługi mogą być wymienialne w zależności od wdrożenia. Osobiście jednak uważam, że realizacja "większych projektów" w PHP to utopia. Może komuś się to jednak przyda.

EDIT: Dependency Injection sprawdza się w unit testach (o ile środowisko unit testów umożliwia użycie DI), szczegóknie w połączeniu z mock-objects.

Bundle 3: Events

System zdarzeń w Symfony 2 jest prosty. Jest dość dobrą realizacją wzorca obserwatora. Autor przyznaje, że wzorował się na notyfikacjach z Cococa.

Implementacja ta przypomina mi naszego firmowego EventBrokera napisanego chyba w 2006 roku. Osobiście wolę django.signals z racji rejestrowania obserwatora do konkretnej instancji sygnału. Z kolei w Symfony obserwator (listener) rejestrowany jest w instancji dispatchera podając nazwę sygnału.

Nasuwają się dwie wady (z doświadczenia):

  • dispatcher może nie mieć zarejestrowanego zdarzenia (trzeba znaleźć odpowiedni dispatcher, przez który będzie przebiegał event),
  • rejestracja i notyfikacje odbywają się przez nazwę - robiąc literówkę przy connect nie mamy szans na informacje o błędzie; takie błędy znajduje się zwykle po kilku godzinach.

Bundle 4: Super wydajność

Wydajność została zwiększona, ale nie uważam że o te mityczne 2.5x.

Benchmark strony "Congratulations..." (index.php) z sandboxa, dla ab -c 100 -n 1000:

  • Symfony 2: 32.18 [#/sec]
  • Symfony 1.2: 19.58 [#/sec]

To jest nieco powyżej 1.5x. Żeby jednak trochę podrasować wersję 1.2 wyłączyłem w settings.yml użycie bazy danych (test Symfony 2 też nie używał BD).

Widok o podobnej złożoności w Django serwowany jest nawet do 200 rq/sec. Strona główna portalu opartym na Django (z użyciem memcache) jest serwowana w trybie developerskim w porywach do 160 req/sec.

Wydajność Symfony 2 nie zachwyca.

Bundle 5: Formularze

Czytałem tylko kod. Są to niemal te same nieudolne formularze, o których już pisałem - Symfony forms vs Django forms.

Podsumowanie

Szkoda czasu.

Krótko o mnie

Jestem programistą i architektem systemów IT. Specjalizuję się w aplikacjach webowych, szczególnie w Python oraz Django, PostgreSQL oraz systemach wyszukiwana ElasticSearch.

Zajmuję się wsparciem istniejących systemów oraz projektowaniem i produkcją. W branży działam od 2001 roku. Oferuję doświadczenie, profesjonalizm oraz indywidualne podejście do zleceń.

Zainteresowanych moimi usługami zapraszam do wysłania zapytania.

Javascript logo PostgreSQL logo Cassandra logo Redis logo ElasticSearch logo Ansible logo HTML5 logo CSS3 logo NGINX logo Docker logo

Komentarze

2011-04-25 01:25:07 sdcsdcsdc:

Kolejny fanboj ;)

2011-04-25 11:38:48 autor:

masz w ogole cos do powiedzenia w tym temacie?

2011-09-14 12:22:13 makerlabs:

Porównywanie framework'ów z dwóch różnych języków nie jest miarodajne... debat ma temat python i php było wiele... każdy z tych języków ma swoje zalety i wady. Jeżeli chodzi o sam framework symfony2 jest to duży krok na przód w stosunku do pozostałych framework'ów (mówiąc stricte o php). Symfony2 pożycza wiele dobrych rozwiązań z innych języków bo niestety jedną z wiekszych wad php jest jego powolna ewolucja co powoduje liczne ograniczenia i z reguły złe nawyki programistyczne. Ja z aktualnego doświadcze i aktualnieia mogę powiedzieć, że symfony2 prezentuje się naprawdę obiecująco na tle innych framework'ów php i aktualnie wykorzystuje go do własnych projektów.

2011-10-12 00:01:57 autor:

SF2 to faktycznie krok w przód (w świecie PHP). Jednak z pośród wielu dostępnych narzędzi wolę wybrać lepsze, trwalsze, może bardziej przyszłościowe, rozszerzalne czy uniwersalne. Stąd Python (ogólne przeznaczenie), stąd Django (web). Jednak w tym wpisie nie przyrównywałem SF2 do Django za wyjątkiem notki o wydajności, że można jednak w dziedzinie web developmentu osiągnąć lepsze rezultaty lepszymi narzędziami. Raczej wskazałem na kilka zaganień, które schrzaniono w SF2. Argumentowałem wady event dispatchera oraz formsów. Wydajność ma drugorzędne znaczenie, ale starałem się obalić mit jej 2.5-krotnego wzrostu. Dostrzegłem też zalety SF2. Może ze mnie "fanboj", ale mam mniej stresu, więcej czasu na relaks i inne projekty. W dobie popularności railsów i django troche śmieszy mnie szum wokół SF - nie oferuje nic, czego nie można zrobić szybciej czy wygodniej. Na zakończenie dodam, iż mimo krytycznej oceny SF podziwiam i doceniam Fabiena. Łebski gość. A że SF nie dla mnie? Mój wybór.

2012-04-27 18:41:57 Marek:

A taki youporn.com to nie jest czasem ten "większy projekt"?

2012-04-27 18:47:13 Marek:

Jeśli chodzi o klasę Request, to bardzo dobrze, że nie pakuje się tam atrybutów typu user itp. Symfony2 został zbudowany w oparciu o specyfikację HTTP, obiekt żądania reprezentuję obiektową abstrakcję żądanie HTTP i tę funkcję spełnia doskonale, ale że Ty masz taki nawyk ze stosowania Django to już Sf2 nie wiń.

2012-04-27 19:32:40 autor:

@Request: Czy zatem obiektowa abstrakcja SF2 na przykłądzie $this->getRequest()->getSession() w kontrze do request.session w Django jest zgodna ze specyfikacją HTTP? Przyczepiłem się do implementacji z mutatorami/akcesorami zbędnymi w dynamicznym języku programowania. To jest zbędny narzut. @Youporn: nie znam specyfikacji tegp projektu. Spróbuj, może Ci się uda. Ostatnio publikowano speca do oryginalnego Prince of Persia na Apple - możemy pogadać.

2012-04-28 13:01:30 Marek:

Spec youporn: http://highscalability.com/blog/2012/4/2/youporn-targeting-200-million-views-a-day-and-beyond.html "Przyczepiłem się do implementacji z mutatorami/akcesorami zbędnymi w dynamicznym języku programowania. To jest zbędny narzut." To twoja opinia, wyrobiona pewnie po latach używania Pythona, po czymś takim frameworka się po prostu nie ocenia. Dzięki za przykład z getSession(), choć dla mnie to jest raczej ok, choć kiedyś dokładnie się temu przyjrzę i napiszę coś więcej na blogu, który mam nadzieję założyć niebawem. Pozdrawiam

2012-04-28 17:50:24 autor:

@youporn: dzięki za link. Główny ich problem to streaming. PHP+FPM wraz z mocnym cache załatwiają dobrą responsywność serwisu. Nie znam FPM i już o jego zaletowadach nie przekonam się. Dependency injection - oprócz stwierdzenia, że jest fajne nie napisano o konkretnym zastosowaniu. Moja opinia o dynamiźmie języka ukształtowała się po latach używania (tj. intensywnego programowania w) PHP, choć Python posłużył do porównania Powodzenia w blogowanu. Czytalności życzę.