Blog | Nette 2, Symfony 2, Zend Framework 2

Nette 2, Symfony 2, Zend Framework 2

První generace MVC frameworků v PHP se nesla v duchu: Hurá, máme ActiveRecord, hezké šablony, celé to funguje a vypadá hezky. Jenže zákonitě se musela objevit otázka, co bude druhou generací PHP MVC frameworků.

Tak třeba CakePHP se vydal cestou evoluce a do verze 2 přišel spíš s evolučním než revolučním rozdílem. Opustil podporu PHP 5. Rozdíl mezi řadou 1 a 2 připomíná rozdíl, jaký proběhl mezi 1.1 a 1.2 (tedy poměrně radikální rozšíření).

CakePHP je asi jediný PHP framework, kterému se podařilo okopírovat do PHP Ruby on Rails tak, aby byl zdroják hezký a použitelný. Bohužel/bohudík evoluční změna se nelíbila jednomu z hlavních vývojářů Cake, Nate Abelemu a společně s Joelem Perrasem vytvořili Lithium, framework plný zajímavých konceptů a myšlenek. Ostatně dnes už jsou Rails ve verzi 3 a ikdyby zase došlo jen ke kopírování, CakePHP by v řadě věcí potřeboval aktualizace (I see you db migrations, inherited resources, formtastic!).

No a Nette 2, Symfony 2 i Zend Framework 2 se vydaly cestou revoluční změny. Neznamená to, že by byl framework napsán od nuly, spíš to znamená, že výrazně posunul paradigma, jakým se vývojář řídí.

V lecčems byla ta revoluce skvělá. Tím, že asi nejčastěji používané PHP FW ve světě (ZF, Symf.) i v Česku (Nette) používají Dependency Injection, předběhly aspoň v něčem nejpoužívanější frameworky pro Ruby i Python. A není to jen DI. Podpora testování se stala „first class“ občanem a týmy za frameworky už nepřemýšlí jen jak testování umožnit, oni přemýšlí, jak ho usnadnit a propagovat. Podobně třeba v Symfony, Zend Frameworku došlo k posunu k modulární architektuře (jedni tomu říkají bundles, jiní moduly). Symfony mělo bundly už dřív, ale ne všechno byl bundle. Teď už je. Spousta dalších vylepšení se objevila na dvorku. Event-driven vývoj, který mělo už Nette 1, najdete i v druhé generaci Symfony 2 a Zend Frameworku 2. A další a další.

Ohromná změna k lepšímu, že?

Třeba Nette se revoluční změna vyplatila a vývojář v něm nepíše o moc víc kódu i v situaci, kdy používá daleko solidnější techniky, konfiguruje si DI kontejner apod. Snad jen NetteDatabase ani nemuselo v tom frameworku být.

Do Symfony 2 si Fabien Potencier připravil spoustu zajímavých konceptů. Framework v lecčems opravdu zjednodušil. Tu a tam vytočil komunitu (třeba když odstranil předpřipravenou administraci). Povedlo se.

Zato Zend Framework 2 je dílo. Je to ukázka toho, jak extrémně chytří lidé s dobrými úmysly dokáží zkazit, co se dá. Ukecanější je prakticky vše. Jednodušší není snad nic. Dependency Injection řeší předávaným Service Locatorem. Náhrada za Zend_Db_Table ZendDbTableGa­tewayAbstractTa­bleGateway, to je opravdu hrozné.

Kdybych měl popsat hned několik věcí, proč je ten framework mnohem horší, než 1, napadá mě hned:

  • opuštění Convention over Configuration – ano, budete psát. Že je Zend Framework krapet ukecanější, na to jsme si už zvykli. Ale tolik? Jen na založení nového modulu, musíte založit 3 soubory (zkuste najít logiku v jejich názvech: module.config.php, autoload_clas­smap.php, Module.php)
  • adresářová struktura – pokud controller musíte hledat v 5. úrovni zanoření, je něco špatného ve státě dánském
  • to je v Zendu nenapadlo, že obrovská spousta controllerů, je takřka CRUD a to zajímavé je v modelu? To nemůžou už konečně udělat InheritedResou­rcesController? (mluvím i na tebe Nette).
  • nenajdu snad ani jednu věc, která by se dala dělat snáze. Jde toho dělat víc, ale běžný provoz bude ještě zdlouhavější. U frameworků zastávám ideu, že framework má mít názor. Má být pro někoho. A když se snaží být pro všechny, není pro nikoho.

V něčem je vidět, že se posunuli dopředu, dokonce ideově předběhli Nette, ale pak dokonale pohnojili implementaci.

Například přenesli validaci z formulářů do modelů. Dobře! Ale proč tak, že musí model implementovat ZendInputFilte­rInputFilterA­wareInterface?

Porovnej kód:

        if (!$this->inputFilter) {
            $inputFilter = new InputFilter();
            $factory     = new InputFactory();

            $inputFilter->add($factory->createInput(array(
                'name'     => 'id',
                'required' => true,
                'filters'  => array(
                    array('name' => 'Int'),
                ),
            )));
            $this->inputFilter = $inputFilter;
        }

        return $this->inputFilter;

A

validates_numericality_of :id, :only_integer => true

nebo

$formElement->addRule(Form::INTEGER, 'ID musi byt cele cislo')

O tom používat filtry na defakto validaci, o tom ani neluvím.

No zkrátka to ještě bude sranda. Zend Framework používám někdy od verze 0.6-0.7. A vím, že jednička až do 1.3 taky nebyla nic moc. Tuším, že i Zend Framework 2 bude do 2.3 obtížně použitelný, API nestabilní.

Rada zní: Pokud chcete použít Zend Framework, použijte zatím 1 a s 2 ještě tak rok počkejte.

Programování

Předejte zkušenosti i dalším a sdílejte tento článek!

Předchozí článek
Následující článek


Jiří Knesl
Business & IT konzultant

Jiří Knesl poprvé začal programovat v roce 1993. Od té doby, díky skvělým učitelům a později zákazníkům, měl možnost neustále růst v oboru vývoje webových aplikací a informačních systémů. v roce 2002 se přidal zájem o ekonomii a v roce 2006 o organizaci práce. Vším tím se konstantně profesně zabývá jak ve svém podnikání, tak i u zákazníků. Za posledních 5 let vydal na tato témata přes 400 článků.

Prohlédněte si moje reference

Mám zkušenosti z rozsáhlých projektů pro korporace, velké podniky, střední i malé firmy, ale i pro startupy v cloudu. Zvyšoval jsem jejich know-how, pomáhal nastavovat jejich organizační strukturu, byl lektorem a mentorem v náročných situacích. Podívejte se, jak vidí můj přínos samotní klienti.

Sledujte mé postřehy na sociálních sítích