Přejít k navigační liště

Zdroják » PHP » Jak jsme zmigrovali 50k řádků kódu z Nette do Symfony za 17 dní ve 2 lidech

Jak jsme zmigrovali 50k řádků kódu z Nette do Symfony za 17 dní ve 2 lidech

Články PHP

Kód, který bychom před dvěma lety přepisovali dobré 3 měsíce, jsme dnes za pomoci automatických nástrojů zvládli přepsat za necelé 3 týdny. Ukážeme vám, jak jsme na to šli.

Nálepky:

Text vychází z anglické verze, která vyšla na autorově blogu jako 3dílný seriál.

Co jsme migrovali?

Backend projektu Entry.do – API aplikace postavená na presenterech, routingu, Kdyby integracích Symfony, Doctrine a pár Latte šablonách, která už 4 roky běží na produkci. Z Nette 2.4 na Symfony 4.2.

Jak je velká? Když nepočítáme testy, migrace, fixtures apod., aplikace má 270 PHP souborů v délce 54 357 řádků.

Říkáte si, kolik má taková aplikace rout? 20…? 50…? 151!

Proč?

Aplikace byla v Nette, které fungovalo a splňovalo technické požadavky. Hlavní motivací na přepis byl umírající ekosystém a integrace Symfony.

80 % rozšíření jsou jen integrace Symfony a Doctrine

Z Nette byly jen prestenery, routing a dependency-injection

Proč používat neudržované integrace Kdyby a Zenify, které stejně dělají jen integraci do Nette/DI, když je tu přímo Symfony? V Symfony vyjde každých 6 měsíců nová verze a nové featury usnadní práci.

Jak jsme to udělali?

Přesvědčil jsem Honzu Mikeše že to: “Dáme týden a když to bude drhnout, tak to zabalíme”. 27. 1. jsme se potkali nad Nette aplikací a 13. 2. šla na staging server už aplikace Symfony. Za 17 dní jsme měli hotovo a na 14. 2. jsme kromě Valentýna slavili novou aplikaci na produkci.

Takhle velký byl pull-request s migrací

Ve skutečnosti jsme se o migraci bavili už na začátku roku 2017, protože Nette ekosystém se pořádně nerozvíjel a Symfony jej technologicky přeskočilo. Tenkrát by ovšem přechod trval minimálně 80-90 dní na full-time, což je šílenost, takže jsme do toho nakonec nešli.

V roce 2019 už máme spoustu nástrojů, které práci udělají za vás:

  • Prvním je Rector, který dokáže změnit jakýkoliv kód který jede aspoň na PHP 5.3 z A na B. V základu umí instantně aktualizovat kód z PHP 5.3 na na 7.4, Symfony z 2.8 na 4.2, Laravel ze statického kódu na constructor injection apod. Navíc si do něj můžete dopsat vlastní pravidla, která dělají cokoliv zvládne PHP programátor (A → B), jen za zlomek času.
  • Druhým je NeonToYamlConverter – ten jak název napovídá převádí NEON syntaxi na YAML.
  • Třetím pomocníkem je LatteToTwigConverter – ten převádí zase Latte do Twigu.

Takže těch 17 dní bylo nakonec dohromady pohodových ~80 hodin (za nás oba dohromady).

20 % ruční práce

I když neradi, 20 % práce jsme museli odpracovat ručně.

Jedním z prvních kroků byl přesun od programování v configu do programování PHP. Oba frameworky se snaží ukázat vlastní syntax sugar pro Neon nebo Yaml. Programátorům to zní sice cool, psát méně kódu, je to ale nepřehledné, framework-specific, a hlavně – statická analýza ani instantní refaktoring si s tím neporadí.

Jak to “programování v configu“ vypadá?

services:
    FirstService(@secondService::someMethod())

Nebo taky:

services:
 -
  class: Entrydo\Infrastructure\Payment\GoPay\NotifyUrlFactory
  arguments:
   - @http.request::getUrl()::getHostUrl()

Jaký normální PHP pattern, kterému skoro každý rozumí i když nedělá s žadným frameworkem, můžete použít?

Factory!

<?php

final class FirstServiceFactory
{
     /**
      * @var SecondService
      */
     private $secondService;

     public function __construct(SecondService $secondService)
     {
         $this->secondService = $secondService;
     }

     public function create()
     {
         return new SomeService($this->secondService);
     }
}

Co jsme refaktoringem získali?

  • Constructor injection!
  • Nezávislost na frameworku – když za 3 roky budeme migrovat na jiný framework, tenhle soubor už nemusíme řešit.
  • Statická analýza funguje
  • Testovatelnější kód, díky PHP kódu místo configu
  • Rector funguje
  • Je to jasný PHP kód

V Nette a Symfony se několik věcí dělalo výrazně různě:

80 % automaticky

Dalších 80 % práce z pull-requestu, který jste viděli nahoře, za nás udělaly automatické nástroje. Ten první stačilo napsat, ten druhý prakticky nastavit.

Neon do Yaml

Neon i Yaml jsou de facto pole s drobnými rozdíly v syntaxi, když jde ale o služby, každý framework je zapisuje trochu jinak. Config se službami měl 316 řádků v sekci services. To nechcete migrovat ručně, tím spíš Neon entity. Navíc stačí jedna chyba v migraci souvisejícího a můžete to dělat celé znovu.

Tak jsem vzal napsal Symplify/NeonToYamlConverter. Stačí předat cestu k *.neon souboru a na výstupu bude krásně převedený *.yaml.

Migrace PHP

Ještě jednou k factory patternu – v kódu bylo několik vlastních Response tříd, které dědily od Nette Response a přidávaly extra logiku. Mohli bychom je upravovat jednu po druhé ručně, jednodušší ale bylo extrahovat je do factory metody:

 <?php

 class SomePresenter
 {
+    /**
+     * @var ResponseFactory
+     */
+    private $responseFactory;
+
+    public function __construct(ResponseFactory $responseFactory)
+    {
+        $this->responseFactory = $responseFactory;
+    }   
+
     public function someAction()
     {
-        return new OKResponse($response);
+        return $this->responseFactory->createJsonResponse($response);
     }
 }

S tím nám pomohl Rector a NewObjectToFactoryCreateRector pravidlo, které Honza vytvořil.

Co ještě zbývalo?

  • Přesun rout z RouterFactory k jednotlivým akcím Controllerům
  • Přejmenování Request a Response tříd + včetně jejich kódů (POST, GET, 200…)
  • Přejmenování tříd a metod na Nette\DI\Container, Nette\Configurator, Nette\Application\IPresenter atd.
  • Změna parent tříd na Presenterech, přejmenování na *Controller
  • Přesun namespacu z App\Presenter to App\Controller

Nejvíc by nám daly zabrat presentery.

<?php declare(strict_types=1);
 
-namespace App\Presenter;
+namespace App\Controller;
 
-use Nette\Application\UI\Presenter;
+use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
-use Nette\Http\Request;
+use Symfony\Component\HttpFoundation\Request;

-final class SomePresenter extends Presenter
+final class SomeController extends AbstractController
 {
-   public static function someAction()
+   public static function someAction(Request $request)
    {
-       $header = $this->httpRequest->getHeader('x');
+       $header = $request->headers->get('x');

-       $method = Request::POST;
+       $method = Request::METHOD_HPOST
    }
}

Syntax Sugar? Syntax Hell

Na chvíli nás taky vypekl Kdyby “syntax sugar”, resp. Kdyby\Translation. V Nette aplikaci nám výpis proměnných (Tom) ještě fungoval:

  • “Hi, my name is Tom”

Ale v Symfony magicky přibyly %%:

  • “Hi, my name is %Tom%”

WTF? Po 15 minutách jsem na to přišli a opravili:

<?php

 class SomePresenter
 {
     public function someAction()
     {
         // Kdyby/Translation differnce to natvie Symfony/Translation
         $this->translations->translate('Hi, my name is %name%', [
-            'name' => 'Tom',
+            '%name%' => 'Tom',
         ]);
     }
 }

Nesmíme zapomenou na přejmenování eventů z Contribute\Events na Symfony KernelEvents:

Z RouterFactory na Controller @Route annotation

RouteFactory je v Nette jedna třída, kde obvykle definujete všechny routy na všechny presentery a jejich akce. V Symfony je tohle úplně naopak. Routy definujete přímo na akci v Controlleru. A aby toho nebylo málo, tak pomocí anotace.

Co s tím? No přesunout jednu routu po druhé – všech 151. Aby toho nebylo málo, měli jsme vlastní RestRoute a vlastní RouteList, včetně rozlišení POST/GET/…, které Nette v základu nemá.

Jak taková jedna změna vypadá?

<?php

 namespace App;
 
 use Entrydo\RestRouteList;
 use Entrydo\RestRoute;

 final class RouterFactory
 {
-     private const PAYMENT_RESPONSE_ROUTE = '/payment/process';
      // 150 more!
     
      public function create()
      {
          $router = new RestRouteList();
-         $router[] = RestRoute::get(self::PAYMENT_RESPONSE_ROUTE, ProcessGPWebPayResponsePresenter::class);
          // 150 more!
          
          return $router;
      }
 }
 
 
 namespace App\Presenter;
  
 use Symfony\Component\Routing\Annotation\Route
  
 final class ProcessGPWebPayResponsePresenter
 {
+    /**
+     * @Route(path="/payments/gpwebpay/process-response", methods={"GET"})
+     */
     public function __invoke()
     {
         // ...
     }
 }

Rector

V roce 2017 bychom všechny tyhle změny dělali ručně. Teď už je naštěstí rok 2019, a my jsme líně použili nástroj Rector.

Pár dní jsme připravovali nette-to-symfony set a ten pak pustili nad celou code base:

composer require rector/rector --dev
vendor/bin/rector process app src --level nette-to-symfony

A je to  :)

Všechno, co jsme se při migraci za těch 17 dní naučili, je v tomto setu. Vy si jen stáhnete Rectora a set rovnou můžete použít.

Od Valentýna do nette-to-symfony setu přibyla kompletní migrace z Nette\Tester  na PHPUnit a počátek migrace Nette\Forms na Symfony\Forms a Component na Controllery.

Na závěr už jen učesat

Po spoustě změn, které se týkaly statického obsahu, sice kód fungoval a testy procházely, ale vypadal trochu rozcuchaně. Tu mezera navíc, jinde zase chyběla.

Můžete použít vlastní PHP_CodeSniffer set nebo PHP-CS-Fixer . Na to jsme použili připravený set 7 pravidel pro EasyCodingStandard:

vendor/bin/ecs check app src vendor/rector/rector/ecs-after-rector.yaml

A tak jsme zmigrovali čtyřletou Nette aplikaci o 54 357 řádcích za 17 dní do Symfony a nasadili ji do produkce.

Komentáře

Subscribe
Upozornit na
guest
60 Komentářů
Nejstarší
Nejnovější Most Voted
Inline Feedbacks
View all comments
Jarda

Hmm, to je zajímavé. Takže píšete, že jednou z hlavních motivací byl ekosystém okolo nette, kdy spousta balíčků a knihoven není udržovaných.

Sám Nette nepoužívám, ale stejně by mě zajímalo jak to vidí ostatn. Na jednu stranu je super, že firmy do Nette přispívají a posílají měsíčně nemalé částky. Na druhou stranu pokud ekosystém okolo skomírá, tak to moc nepomůže a podobných přechodů bude do budoucna více.

David Grudl

Nette Framework je v nejlepší kondici za svou existenci. Jeho ekosystém se má čile k životu, zmíněné Kdyby balíčky v tuto chvíli připravuje na aktuální verzi Nette jeden z největších e-commerce specialistů Pecka Design https://twitter.com/peckadesign/status/1108633781962006528 a zájem o Nette proniká do světa.

K migraci na Symfony není naprosto žádný důvod.

Článek je hromada lží a polopravd, zcela pomíjející, co přechodem z Nette na Symfony uživatel naopak ztratí, ignorující bezpečnostní otázky, ale hlavně před čtenářem tají, že se týká migrace velmi specifického projektu. U běžných projektů by přechod představoval řádově složitější a dražší problém. Se sporným výsledem.

Což je pochopitelně záměr. Celé je to reklama na placené služby Tomáše Votruby a na jeho open source nástroje. Je pravdivá asi tak, jako každá jiná reklama na zázračné zhubnutí za 17 dní.

Založit si byznys na manipulaci s klienty a parazitování na práci jiných je IMHO něco, co Tomáš, a znám ho pár let, nemá zapotřebí. Snad si to uvědomí dřív, než si tím zničí jméno.

devnull

Vývoj kolem Nette nesleduju, ani ho nepoužívám, ale tenhle příspěvek mě přiměl se na chvilku podívat.

Přímo na homepage nette.org je upoutávka, že verze 3.0 se blíží. V 9 měsíců starém blog postu se píše, že podpora 2.4 skončila podle plánu v červnu 2018 a trojka vyjde brzo (říjen až listopad 2018).

Pokud je Nette v nejlepší kondici, chtělo by to dát nějak vědět. Na náhodného kolemdoucího to působí tak, že neexistuje žádná podporovaná verze a vývoj nabírá mnohaměsíční zpoždění.

David Grudl

Článek popisoval situaci před 9 měsíci, která se od té doby hodně změnila. Prodloužili jsme podporu pro verzi 2.4, aby nebyla přerušena a zároveň mohli do přípravy verze 3.0 věnovat více času.

Díky tomu bude Nette 3.0 jedním z úplně prvních frameworků plně využívajících všech výhod PHP 7.1.

Oficiální představení proběhne na Nette Conference za cca dva týdny: https://conference.nette.org.

Lopatin

Framework využívající všechny výhody 7.1. – to je nic neříkající blábol naprosto stejného ražení oproti kterému se ohrazujete.
Že framework využívá výhody nějaké verze PHP je sice hezké, ale jestli poslední 3 roky trávili vývojáři Nette tímhle, tak je to k ničemu. Nějaká zásadní architektonické změny, které posunou framework o krok dále a které řeší problémy uživatelů, to je podstatné, nikoli nějaká verze PHP.

Oldisy3

kromě toho už všichni koukaj po verzi 7.3

David Grudl

Zrovna PHP 7 přineslo dost zásadní novinky v podobě striktního chování, sklarárních typehintů a typyhinty pro návratové hodnoty funkcí a metod. Programování to posouvá na novou úroveň a za sebe preferuji používání knihoven, které jsou striktně napsané.

Nette tohle má, frameworky jako Symfony, CakePHP nebo Zend zatím ne. Ty se stále drží úrovně PHP 5.

Proto má smysl tuhle přednost zdůraznit.

Oldisy3

testuje se třebas nette na php 7.3?

David Grudl

Samozřejmě, všechny testy běží na https://travis-ci.org/nette/.

Dok

Tak, jako v open source světě existují kromě programátora různé pozice, jako např. překladatel, grafik, atd …, zapojují se do open source i odborníci na public relation? IMHO umět komunikovat s veřejností není samozřejmost. Je to obor jako každý jiný. Já odborník rozhodně nejsem, ale pokud bych měl dát zpětnou vazbu jako běžný konzument, tak musím přiznat, že současná forma na mě nepůsobí příliš sebevědomě.

jkucharovic

Davide napiš, prosím, článek o přechodu ze Symfony na Nette, kde všechny ty lži a polopravdy vyvrátíš.

Redakce to zcela jistě uvítá a ráda ti za to i zaplatí.

T(h)or

Zajímavý přístup nalákání lidi do komunity. Když někdo odejde, když někdo začne používat něco jiného, když přestane glorifikovat, když …, tak se mu dostane Ad Hominem na rozloučenou. Uff, ulevilo se mi, že Nette je stále nejlepší. Chyba je stále jen u těch, co nemají rádi Nette.

MiloNemilo

Ale ne. Kdybyste průběžně sledoval dění, přijde vám ta reakce adekvátní. Takhle to asi vypadá dost ostře.

Na Nette fóru a Slacku se běžně řeší integrace Symfony komponent do Nette úplně v pohodě.

Jan

Za těch 200k měsíčně zatím moc práce, kromě soukromých dovolených, vidět na Nette nejde.

Martin Hassman

Tohle mě zajímá. Co konkrétně není vidět? Tedy co konkrétně nevidíte a chtěl byste vidět? Předpokládám, že máte nějaké očekávání, to nebylo splněno a proto jste zklamaný. Co je to za očekávání?

Za sebe dodám, co vidím já, když se podívám na web Nette. Jdu hned kontrolovat Download a tam vidím poslední vydanou verzi Nette 2.4 – vydáno v červnu 2016. Což mi opravdu přijde poněkud archaické. Projekt s poslední verzí z června 2016 vypadá, že umírá.

Na tom webu se mi nabízí nějaké vývojové verze, ale když nejsem expert na Nette, tak zdovolením nějaké nestabilní verze zkoušet nechci.

Z těchto důvodů na mě ten webu skutečně působí, jakoby projekt skomíral a David nic nedělal. Zároveň z různých informací vím, že to úplně není pravda. Připravuje se třeba nová verze, nejspíš Nette 3, ale o té jsem tam nic nenašel. Na Twitteru je vidět, že se stále něco děje děje, mění a vyvíjí, ale na hlavním webu je mrtvo.

Z toho všeho mám pocit, že David a další dělají dost. (Nesnažil jsem se zatím přesně nalézt a specifikovat ono dost.) Ale plně souhlasím, že to vidět nejde. Nejsem součástí komunity Nette, jen pozorovatel zvenčí a vidím… ano ono mrtvo.

Vnímám to spíš jako komunikační problém. Čili PR problém. Možná by stačilo říct něco jako „Makáme na Nette XY, až ho vydáme, pochopíte, co jsme vše dělali a proč to vypadalo mrtvě.“

Ale to jsou jen dohady. A jsem zvědav, s čím Nette přijde. A zda to (zvenčí) uvidím.

David Grudl

Uživatelé Nette sledují dění spíš přes release notes na fóru/GitHubu nebo přes blog a stránky ‚download‘ se staly od nástupu Composeru druhotnou záležitostí. Ale díky za postřeh, že pro kolemjdoucího to může působit jako skomírající projekt.

Přidal jsem proto stránku https://nette.org/en/releases kde je vidět, že aktivita je opravdu neutuchající :-)

Martin Hassman

👍

Oldisy3

Jo už tak rok co občas zavítam na nette.org a nebo blog, si řikám hm asi ude lepší se rozmyslet jestli přejít na laravel nebo symfony. je fakt že do downloadu sem se dlouho nedival, nejaky opravy composerem chodej, ale blog ve me budi dojem ze se nic nedeje (samozrejme vim e se vybirali/jí penize a dělá se verze 3, ale aby nebyla poslední), kdyby se tam objevil třebai kratší text co cca 14 dní nebo měsíc hned by to budilo víc důvěry.

/dev/urandom

Trochu pouzivam Nette, trochu Symfony, ale hlavne, a nestydim se za to, pouzivam Laravel.

Ale souhlasim, ze tohle pusobi jako reklamni clanek a to zpusobem, jakym pest pusobi na oko.

A nejhorsi fabulace jsou polopravdy a zaroven je vyvratit da mnohem vic casu nez je vytvorit, tak na to kaslu.

Tomáš Syrový

Tak nějak mne mrzí, že vznikají dva tábory „only-nette“ a „only-symfony“. Místo toho, aby se oba dva frameworky vzájemně inspirovali a používali navzájem, tak vzniká válka o to, kdo má větší pé*o. Oba dva frameworky mají své plusy a mínusy a je dobré znát oba dva a chytře je kombinovat. Koneckonců i to se děje – SymfonyBundles se integrují do Nette a z Nette do Symfony přechází často Laděnka/Tracy (byť už je to samotný projekt) a jistě i další balíčky/zvyklosti apod.

Nette jsem používal na hodně úspěšných projektech a Symfony zrovna tak. Nemyslím si, že Nette nějak umírá – to spíš Symfony dělá různé skopičiny a jede moc hrrr… Častěji jsem řešil nesoulad v Symfony balíčcích než v tom, že by Nette zastaralo.

Přepis Presenterů do Controllerů a Latte do Twigu – jako vážně? Proč to?

Věta Tomáš Votruby, že Nette skomírá, a proto se rozhodli přejít na Symfony, je zavádějící. Kdyby napsal, že si to prostě chtěli vyzkoušet, nebo že nabírají programátory z Francie, tak ok. Vlastně už ani neplatí běžný argument, že Nette je one-man show. Co bude Tomáš dělat, až bude skomírat Symfony? Bude migrace zpět na Nette, Laravel, Yii, Zend? A není to vlastně vůbec jedno?

Na druhou stranu Davidova reakce není úplně šťastná, ale je pochopitelná. Myslím, že kvůli Davidovi se hodně lidí něco naučilo a nyní vydělává za to těžké prachy. Je jedno, jestli aktuálně používají Nette nebo Symfony… Musí to ale umět dobře!

Rector je zajímavý – někdy v noci si ho doma z postele vyzkouším na něčem lokálně, ale na vydělávajícím projektu si to nelajznu…

Lukáš Brzák

Davide, takové vyjádření je hodno malému dítěti, kterému sebrali hračku a tak kope kolem sebe jako splašené. Používat dokola jakousi anketu (z roku 2015) o oblíbenosti frameworků je komické. Zkus přijmout fakta a podívat se na reálná čísla, která mají o oblíbenosti frameworků skutečnou vypovídající hodnotu:

Za mě je odchod od člověka jako jsi ty naprosto pochopitelný a pokud to chceš změnit, buď pro svou komunitu dobrý leader hodný následování. Kritika je často opodstatněná, ego je tvůj velký nepřítel.

Zdenek

David je skutecne co se tyce PR antispecialista. Ja osobne po jednom jeho tweetu ho nemohu vystat a taky jsem kvuli tomu na nete zanevrel. Proste chemie.

yarex

Este par rokov skusenosti a zistite, ze ciste php bez frameworku je najlepsie :-)

Mlocik97

Ešte par rokov, a zistíme že čistý node.js a Golang je najlepší… :P

Dok

A za dalších pár roků zjistíte, že nejlepší je čistá světnička bez počítačů někde v Beskydech nebo třeba v Horehroní. PHP vám ovci neostříhá. Akorát jsme možná na špatném serveru. :-)

Lopatin

Za mě určitě palec nahoru. Je na každém jak si situaci okolo Nette vyhodnotí. Já bych si jí vyhodnotil stejně. Je sice fajn že po injekci 200k měsíčně odplynul autorovi Nette splín a chystá pro nás novinky, nicméně roadmapu Nette jsem nenašel, Google vrací tohle – Nette 3.0 alpha vyšla před 3mi lety – https://forum.nette.org/en/28023-nette-3-0-0-alpha-released. U Symphony je tohle https://symfony.com/roadmap.

Mě to stačí k souhlasu s článkem a kdybych k tomu měl ještě někoho jako Tomáš Votruba, který prostě v Symfony umí parádně, tak vůbec neváhám a klidně mu na to dám i měsíc, protože se to vyplatí!

Z reakce Grudla je jasně vidět jak je Nette na tom bídně. Pane Grudle, pokud je to všechno kupa lží a polopravd, tak tady čekám článek, který to vyvrátí a který předvedete migraci obdobného projektu ze Symfony na Nette/Kdyby (samotné Nette by to na to nestačilo? hm asi ne) s tím jak to všechno bylo parádní a s jakými cool nástroji z Nette ekosystému to zvládli. Samozřejmě článek bude nikoli od Vás, Vy se věnujete přece naplno programování, ale od nějakého vašeho zákazníka/uživatele. Do té doby jsou ty Vaše výlevy jen kupa lží a polopravd.

P.S.: Redakci prosím o lepší korekturu, hned na začátku: API aplikace ostavená na presenterech, routingu. A v textu jsou i další překlepy.

David Grudl

Byl bych velice rád za článek od uživatelů Nette, který by popsal migraci z jakéhokoliv jiného systému, výhody i úskalí, ale jak jistě potvrdí redakce Zdrojáku, lidem se články psát nechtějí a je velmi těžké najít nové autory. Byť vím o spoustě takových případů.

Koneckonců tohle není článek od spokojeného uživatele. Je to článek od autora všech zmiňovaných migračních nástrojů. Je to tedy čistě reklamní text. Když výrobce přípravků na hubnutí sepíše článek o tom, jak jsou jeho přípravky skvělé, je dobré při čtení trošku zapojit kritické myšlení.

bene

To že se jedná o specifický projekt Tomáš Votruba uvedl v první větě v první sekci „Co jsme migrovali?“. Cituji „API aplikace postavená na presenterech, routingu, Kdyby integracích Symfony, Doctrine a pár Latte šablonách“. Tento popis mi stačí, abych si udělal představu, jak takový projekt vypadá. Článek je navíc určený pokročilejším programátorům, který by si představu měl schopen udělat také. Článek pak obsahuje v podstatě všechny zásadní změny, které byly potřeba udělat.
Tudíž nařčení Tomáše Votruby je lživé.

Pokud David Grudl kritizuje Tomáše Votrubu, že si daným článkem dělá reklamu, cituji „Je pravdivá asi tak, jako každá jiná reklama na zázračné zhubnutí za 17 dní.“, tak by si měl první zamést před vlastním prahem. Na svém webu se Nette chlubí (dělá si reklamu), že je třetí nejoblíbenějším PHP frameworkem na světě (https://www.sitepoint.com/best-php-framework-2015-sitepoint-survey-results/). Každý, kdo rozumí statistice nebo má alespoň trochu selského rozumu a umí číst zjistí, že 770 hlasů, což je druhé nejvyšší skóre hned po USA s 819 hlasy, je z České republiky (300 mil obyvatel VS 10 mil obyvatel). Francie (odkud Symfony pochází, 65 mil obyvatel) dodala 343 hlasů.
Tím samozřejmě nerozporuji, že by Nette na třetí příčku nedosáhlo. Nicméně je jasné, že rozdíl cca 500 hlasů mezi Nette a Symfony absolutně neodpovídá realitě a o oblíbenosti daného frameworku vypovídá asi tolik, co reklama o účinnosti pilulek na hubnutí.
David Grudl přirovnává článek (použité nástroje) k reklamě na hubnutí ve více komentářích a tím se snaží autora očernit. A i kdyby to byl jen článek napsaný proto, kde autor představí svůj produkt na reálném příkladě, zdůvodní pohnutky, nevidím na tom nic špatného.

Tomáš Votruba v komentářích uvedl, že dotaz na převod měl již od třech firem. David Grudl předpokládám takové dotazy nedostává, to ale neznamená že neexistují a napsat větu „Založit si byznys na manipulaci s klienty…“ je daleko za hranicí slušnosti.
Tomáš Votruba přidal odkaz na svůj anglický článek, který popisuje situaci kolem Nette. A rozhodně má pravdu. Sám jsem v Nette programoval a přešli jsme před lety na Symfony. Jedno z nejlepších rozhodnutí, co jsem jako člověk zodpovědný za vývoj udělal. Bylo v tom víc než jen legendární tweet Davida Grudla, to ale není podstatné. Podstatné je, že když se zeptáte většiny Symfony vývojářů, kteří přešli z Nette, tak tento tweet uvedou jako hlavní argument. Upřímně a bez nadsázky Davidovi Grudlovi za tento tweet děkuji. Otevřel tím Symfony dveře do ČR, vznikla konkurence ze které těží vývojáři (mohou si vybrat) a také firmy (mají na výběr programátory). Vlastně by měl dostat od antimonopolního úřadu cenu.

Dále David Grudl argumentuje, že Kdyby balíčky se nyní aktualizují, ale věděl to Tomáš Votruba v době kdy tento převod uskutečnili? Že je Nette ekosystém v nejlepší kondici? První zmínka „Nette 3.0.0 alpha released!“ je na forum 2 roky stará. Já si tedy žijící ekosystém představuji jinak. Ano, díky příspěvkům se situace změnila, ale jak je to dlouho? A co ten čas před tím? Nette ztratilo, vznikla poptávka po Symfony a myslím, že je zbytečné abych tu dále vypisoval proč.

Je nesmysl tady vyzývat Davida Grudla, aby napsal článek na téma „Ze Symfony na Nette“ protože takovou potřebu nemá. Takovou potřebu nejspíš nemá jediný člověk na světě. Nicméně by měl někdo z Nette komunity, pokud nechtějí aby slova Davida Grudla byly jen mlácení slámy, vydat článek vysvětlující větu „…zcela pomíjející, co přechodem z Nette na Symfony uživatel naopak ztratí, ignorující bezpečnostní otázky…“, kterou se David Grudl ohání. Obzvlášť informace ohledně ignorace bezpečnostní otázky mě velmi zajímají. Pokud tedy nepůjde o autoescape Javascriptu v Latte, kdy v Twigu musíte udělat <script>{% autoescape 'js' %}{% endautoescape %}</script>, protože to je ohraná písnička, která v Symfony světě nikoho netrápí. A argument, že je to otravné/že na to můžu zapomenout neberu. Javascript píšeme pouze takto a pokud někdo píše inline, tak to je chyba sama o sobě. Za to Nette trpělo (možná stále trpí) problémem komponentového návrhu, kdy nezkušený vývojář v Nette udělá lehce, na první pohled neviditelnou chybu v zabezpečení komponent (vyvolávání komponent v jakékoliv akci v presenteru).
Symfony se o security stará, ostatně je autorem https://github.com/sensiolabs/security-checker. O security problémech informuje https://symfony.com/blog/category/security-advisories a fixuje je.

Pokud se Nette skutečně postavilo na nohy, přeji mu mnoho štěstí.

  • Pokud na něm stojí projekty, které se v podstatě jen udržují, je nesmysl měnit framework
  • Pokud máte ve firmě špičkové programátory v Nette a platí co píše David Grudl, nemá smysl se přeorientovávat
  • Pokud se rozhodujete co ve firmě dál, co se jako programátor naučit za framework, se Symfony nemůžete šlápnout vedle a z osobních zkušeností považuji Symfony za lepší volbu. Stačí se jen podívat, jak Symfony informuje o novinkách https://symfony.com/blog/. Po stránce dokumentace ale i technické a funkční má Nette co dohánět (celý tento bod je můj subjektivní názor)

Závěrem bych chtěl říct, že David Grudl pro českou PHP komunitu udělal hodně a zaslouží si respekt. To ale neznamená, že nemůžeme být k Nette kritičtí. Že někdo nemůže napsat článek o přechodu z Nette na Symfony, aniž by pak byl urážen a navíc dost pofiderně. A pokud lidé z Nette komunity na tento slušně, věcně a v podstatě neutrálně napsaný článek reagují takto, jsem rád, že už nejsem součástí

Oldisy3

dávam plus.
dotaz: o laravelu jste neuvažovali?

bene

Na Laravel jsem se díval, ale odradil mě jeho statický přístup. Nechci tady vyvolávat flame ohledně static hell, mám pocit že Laravel Facades není nutné používat a lze psát čisté DI, ale návrhové vzory typu Service Locator, Active Record, Singleton a pod jsem zažil na několika větších projektech a vyhýbám se jim obloukem. Nehledě na to, že Laravel staví na Symfony komponentách, hlavně pak na http-kernel a http-foundation což je jádro Symfony frameworku. Tak proč nevyužít rovnou Symfony?

Dalším obrovským kritériem byla stabilita/zázemí frameworku. Nechtěli jsme se dostat do stavu, který panoval v Nette (aktuální stav neumím posoudit). Mám pocit (už si to moc nepamatuji, takže se možná mýlím), že Laravel byl na tom podobně jako Nette, tzn. One man show. Za Symfony stojí společnost, která do něj nasypala obrovské peníze (http://fabien.potencier.org/sensiolabs-raises-5-million-euros-to-boost-the-symfony-ecosystem.html), přesto nebyla v plánu žádná prémiová verze, stále licence MIT a to už je pořádný argument.

Dalším kritériem byla dokumentace. Kdo chce, může se podívat. Za těch x let si nepamatuji že by nově vydaná featura nebyla ihned v dokumentaci. Možná jsem měl štěstí, nevím. Samozřejmě jsem za tu dobu na cca 2 „chyby“ v doc narazil, ale to fakt řešit nebudu. Odkaz na novinky jsem jako příklad, jak Symfony informuje, dával. Každé pondělí v tramvaji si přečtu, co se za ten týden udělalo, co se plánuje, kdo co o Symfony napsal, jaké jsou trable jiných vývojářů a co by chtěli změnit a odkazy na další zajímavé stránky o návrhu aplikace, použití toho či onoho v souvislosti se Symfony. Každé pondělí! A pokud potřebuji, zobrazím si přehledně co v jaké verzi je za novinky https://symfony.com/blog/category/living-on-the-edge

Dalším kritériem je LTS verze a sémantické verzování. Obojí Symfony má https://symfony.com/doc/current/contributing/community/releases.html a https://symfony.com/doc/current/contributing/code/bc.html. Sémantické verzování je obzvláště u frameworku, který je integrován do poloviny zdrojáků velmi důležité. Projekty, které hodně žijí pravidelně updatujeme a máme je na aktuální verzi. A díky Symofny přístupu je to paráda. V minor vezích jsou deprecates a první následující major verze je stejná jako poslední minor, ale očištěná o deprecates. Nepamatuji si, že bychom měli s nějakým přechodem problémy, vždy to proběhlo hladce. Možná jsme měli štěstí, že jsme nepoužili něco, co se pak rušilo. Nedávno jsme akorát jednu security autentizaci (jedna třída) předělávali na Guard, protože ta původní je deprecated. Ale do verze 5.0 bychom to vůbec dělat nemuseli. Pamatuji si, jak jsme u Nette šíleli když v nějaké minor verzi byla odstraněna konstanta Form::REGEXP nebo tak nějak. Abychom mohli přejít na novější verzi, která řešila bugfixy a nějaké nové features, museli jsme prolést cca 20 repozitářů s moduly a nahradit to. V Symfony by jsme to udělali postupně, pěkně v klidu, každý ve svém modulu, za který je zodpovědný, … David Grudl tuším někde napsal, že Nette sémantické verzování dodržovat nebude, ok, klidně, ale co se mě týče, děkuji nechci.

Další kritérium pro výběru frameworku bylo jeho rozdělení na jednotlivé komponenty. Potřebovali jsme vybudovat jednu část projektu, který běží na Nette 0.9 nově tím, že ji připojíme. Symfony tohle splňuje od verze 2 a využili jen několik komponent. Začínali jsme tuším na verzi 2.1 nebo 2.2. Nezamýšlený benefit z toho byl, že manuálním spojováním komponent dohromady získá programátor skvělou zkušenost a představu, jak to celé funguje.

Další kritérium byla koncepce přetvoření Request to Response a vyhnout se konceptu Nette Application, což považuji za jednu z jeho největších technických vad (to je na samostatnou diskuzi). Co jsem četl (omlouvám se, pokud to je jinak), Nette má v plánu přejít na koncept Middleware. Pokud to ale nebude v ohlášené verzi 3, tak Nette vývojářům není co závidět. Pominu-li aktuální koncept samotný, tak s verzí která Middleware přinese přijde i jiný styl vývoje v Nette. Nette předpokládám bude mít middleware, který zpětně původní koncept implementuje, jinak by si úplně podřezal větev, ale bude to trochu schizofrenní stav. Ale možná si to jen špatně představuji a bude vše při starém. Symfony už svou cestu našlo od verze 2 a jen provádí evoluci, která výrazně usnadňuje programátorům život. Symfony tuším verze 3.4 je dokonce revoluce v konfiguraci projektu, kdy projekt teoreticky nakonfigurujete na cca 10 řádků (podle množství použití skalárních typů v konstruktorech a i to lze snadno vyřešit obecným bindem). Mám pocit že Nette zatím jede po polňačce a na asfaltku teprve možná vyjede (to není myšleno hanlivě).

Samozřejmě ani Symfony není dokonalé. Vadí mi několik věcí

  • V příkladech je používán abstract controller, který umožňuje použití DI jako Service Locatoru. Mě osobně se to nijak netýká, navíc controolery jsou dosti specifické (měli sloužit jen k transofmarci HTTP dat), tudíž to tolik nevadí. Ale je lepší učit programátory dobrým návykům od začátku. V tomto jsem něco jako programátorský inkvizitor, a také proto jsem Laravel zavrhnul velmi rychle
  • Razení přístupu použití modelových entit ve formuláři (stejně jako předchozí bod)
  • Komplikované zastavování validace na nějaké constraint (Group Sequence)
  • Translátor context – To co Tomáš Votruba ve svém článku u translátoru popsal jako „Syntax Sugar? Syntax Hell“ by vlastně měl být výchozí stav
  • „Iterface“ suffix – Toto není vyloženě chyba Symfony ale PHP komunity obecně. Nicméně Symfony s Doctrine (která ho má snad jen u jednoho rozhraní) možná měli sílu tuto zrůdnost přebít. Nette to dělá (dělalo) taky špatně (prefix „I“), ale je to alespoň kratší

Když už jsem se tak rozepsal, tak se ještě vrátím k článku Tomáše Votruby, kdy jsem si uvědomil, že jednu polopravdu tam skutečně má. Jedná se o routování. Není totiž pravda, že v Symfony je to naopak, respektive zvolené anotace jsou pouze jednou z možností. Lze routy definovat stejně jako v Nette v jednom souboru. Podporované formáty jsou YAML, XML, PHP a zmíněné annotace. Osobně preferuji (a používáme) YAML. Anotace mají své výhody i nevýhody. Přiznám se, že teď nevím jestli leze určit pořadí importovaných rout z anotací, ale pokud ne, tak je problém pokud by jste měli nějakou obecnou routu, která bude řešit slug z databáze. Tato routa by pak mohla předběhnout specifické routy. Lze samozřejmě takovou routu udělat jinak a zaručit, aby byla poslední, ale pak se dostanete do schizofrenního stavu kdy něco je tak a něco jinak.

Původně jsem chtěl pouze odpovědět proč Symfony a ne Laravel. Když jsem si to po sobě přečetl, zní to jako reklama :D Raději to uvádím rovnou, protože tuším, jaká by pak byla reakce. Ale nakonec proč ne. Proč nepodporovat framework, který používám, vždyť je to také jistý způsob přispívání. Rozdíl mezi výše napsaným a reklamou na pilulky na hubnutí je cca 10 let (cca 8 let aktivně) vývoje v Nette 0.9 – 2.3 a cca 6 let v Symfony 2.2 – 4.2.

P.S.: V dávné době jsem doporučoval Nette, napsal jsem nějaký návod, chtěl jsem vydat extension (v době kdy jsem už primárně dělal v Symfony), ale z toho sešlo, protože Nette DI trpí koncepční chybou a byl trochu aktivní na foru.
Netvrdím, že jsem pro Nette udělal hodně, jen to uvádím, kdyby mě někdo chtěl napadnout, proč jsem něco podobného nenapsal pro Nette

P.S.2: Pokud to tak vyznělo, tak se omlouvám, ale nebylo mým cílem se navážet do Nette nebo Davida Grudla, ale jeho reakce na Tomáše Votrubu je dost přestřelená. Mě je situace kolem Nette vlastně už ukradená. Máme jediný projekt na verzi 0.9, který dožije a rozhodně ho nebudeme povyšovat pomocí Rektora natož ručně ;) Všechny ostatní projekty na Nette byly subdodávka/spolupráce pro někoho jiného a ti se o ně starají sami. Tudíž se mě situace kolem Nette nijak nedotýká.
Pokud to byla reklama Tomáše Votruby na své produkty a když se nad tím člověk logicky zamyslí, tak on ani automatizovaný update/přechod než u frameworku nebo větší knihovny nedává smysl. A prostě to padlo na Nette. Chápu, že to Davidovi není příjemné, ale Tomáš nenapsal nic hanlivého, pouze popsal své pohnutky a situaci jak ji vidí. David mohl slušně oponovat. Pak by má reakce nikdy nevznikla

Přeji hodně štěstí s výběrem frameworku…

Oldisy3

Dík za vyčerpávájící odpověď.
No situace kolem nette na mě působyla takovým dojmem že asi tak verze 3 bude poslední. A z toho důvodu sem se začal dívat po jiném fw, čili teď přemítám (ještě nerozhoduji) jestli laravel nebo symfony. A zatím je to u mě na úrovni že nemám rád vážnou hudbu, ikdyž samozřejmě používám v aplkacích symfony komponenty (kdyby console), ale i treba collection z cakephp, z laravelu zatím nic, ale čeho se děsím je twig. Nelíbí se mi syntaxe (odkojen na smarty).
Middleware uvidíme jak dopadne, v současné době mě třebas trápí že musím hakovat Form abych do něj dostal container s addXXX vlastníma controlama a měl je v našeptávání, spíš by se mi líbylo kdyby bokem formu existoval builder, se sadou addxxx. no uvidíme jak to dopadne.
A protože sem zdědil spoustu palikací na nette, tak i teď u jednoho projektu přecházím z noFW na nette.
Ale co se volby laravel/symfony týče, budu muset zkusit na nich něco postavit abych se rozhodnul fundovaně.
Uvidíme jak to kolem nette bude pokračovat.

bene

Ohledně Twigu je to velmi individuální. Mám třeba kolegu, kterému se syntax Latte vůbec nelíbí. Jediné co mi ze začátku chybělo jsou n makra, ale dnes už si na ně ani nevzpomenu, pokud nezačne debata jako tato. A syntax mi přijde v poho, nemám s ní žádný problém. Je to o zvyku, ale chápu, že se to někomu nemusí líbit. Dále musíš dvěma řádky ošetřit autoescaping v Javascriptu, to jsem už někde zmiňoval.

Za mě má Twig několik featur, kvůli kterým bych Latte už nepoužil (možná už má některé i Latte):

  • Perfektní a aktuální plugin do PhpStormu
  • Zobrazení chyb v Twigu ne v PHP (pokud máš chybu v syntax ve Twigu)
  • Parádní rozšiřitelnost (makra, funkce, filtry). V Latte mi to nevyhovovalo i když přiznávám, že se to s každou verzí zlepšovalo
  • Neřeším, co je pole, promenna nebo get/is metoda, proste píši user.id, je to hrozně návykové
  • Proměnná nemá na začátku dolar
  • ŽÁDNÝ PHP kód, nutí tě to dělat šablony čisté
  • Absolutní odkazování na další šablony. Latte to dělá relativně, což komplikuje jejich přetěžováním které je běžné, zvláště pokud máš vlastní komponenty
  • Klasický parser místo regularních výraců, které neskousnou třeba toto {include $path→root('xyz.latte', ['a' => 1])}. Je třeba si uložit to pole první do proměnné a tu pak použít (ten příklad řeší předchozí bod)

Pokud používáš PhpStorm, tak formuláře v Symfony jsou super. Prvně se mi nelíbili definice chování typů (control v Nette) přes pole, jenže díky pluginu do PhpStorm to není nutné řešit. Plugin je aktualizovaný, dokonce ti napovídá jaké položky (name) do formu přidávat, když ho máš spojený s třídou. Ano pokud nepoužíváš PhpStom, je to na houby (nikoho takového neznám, ty cca 2 tis ročně za to stojí). Na první pohled jsou Nette formuláře výrazně jednodušší, ale jakmile jsem jich pár udělal, vrátit bych se nechtěl.

Symfony formuláře mají několik benefitů (možná už má některé i Nette):

  • Typy jsou služby, tzn. můžeš mít svůj typ, třeba výběr států, které máš v databázi. Pak už jen ve formu ten typ použiješ a nemusíš si zároveň injektovat službu vytahující ti dané objekty z db (to už máš v tom typu)
  • Můžeš pracovat s objekty, třeba v selectboxu
  • Můžes provázat s objektem
  • Dynamické formy díky eventům
  • Spousta předvolených typů (https://symfony.com/doc/current/reference/forms/types.html)
  • Oddělený render od logiky
  • Předpřipravené styly pro bootstrap

Nevím, jak hackujes Nette formy, abys tam měl svoje addXyz(), ale lze to udělat jednoduše:

class MyForm extends Nette\Application\UI\Form
{
    use MyContainerTrait;
}

class MyContainer extends Nette\Forms\Container
{
    use MyContainerTrait;
}

trait MyContainerTrait
{
    public function addContainer(string $name): MyContainer
    {
        // Stacilo by volat parenta,
        // kdyby Nette melo v teto metode $control = new static;
        $control = new MyContainer();
        $control->currentGroup = $this->currentGroup;
        if ($this->currentGroup !== null) {
            $this->currentGroup->add($control);
        }
        return $this[$name] = $control;
    }

    public function addMyControl(string $name, string $label = null): MyControl
    {
        return $this[$name] = new MyControl($label);
    }
}

$form = new MyForm();
$form->addText('text');
$form->addMyControl('my_control');
$form->addContainer('container')
    ->addText('text')
    ->addMyControl('my_control')
;

Lze dosáhnout i chování jako v Symfony, mít v controls injektnuté služby. Stačí si udělat továrnu na svůj form a tu pak injectovat do kontroleru
Navíc to má výhodu, když bude v Nette něco odstraněno, ty si to přidáš na jednom řádku.

K tomu mě napadá jedna věc, jak David Grudl vychvaloval, že Nette 3.0 má všude typhinty. No tak to pak udělat nepůjde (pokud by sis neudělal metodu addMyContainer()), dokud nenasadíš PHP 7.4. Doufám, že Symfony se striktním typováním počká

bene

Oprava k poslednímu odstavci:

/**
 * @return MyContainer
 */
public function addContainer(string $name): Nette\Forms\Container
{
    $control = new MyContainer();
    // ...
}

Bohužel se ale dostaneš na úroveň PHP 5

Oldisy3

presne jak si uved priklad formu to mam poskladane, povazuju to za necisty hack, container je v podstate god object, a mam s tim filosofickej problem.
pouzivam eclipsu s codemixem.
jak sem psal sem odkojenj na smarty, v tom pridelat filtr/makro bylo peklo take prechodem na latte sem si dost polepsil, samozrejme zezacatku sem udelal skolackou chybu a vyzbrojen znalostmi co vsechni to umi, sem spachal nekolik slozitejch sablon.
v soucasne dobe se snazim udrzet sablony co nejjednodussi, pokud mozno bez nested ifů, a bussines logiku tedy resit v componente a do sablony posilat to co se skutecne bude zobrazovat, snazim se v sablonach ani prilis neopuzivat filtry. kdyz uz mam vlastni makra tak bootstrap opakujici se triviality.
n makra se snazim neopuzivat, sou ve zdrojaku spatne videt.
jestli se nepletu v typehintu muze bejt interface, takze snad nette 3 bude trochu vic ointerfacovane, a tedy to pujde. container jako takovej by klidne mohl byt zvlast, treba traita, ve spouste component ho nepotrebuju.
do sablon vetsinou posilam but scalary nebo dto, takze neresim jestli je to pole nebo object.
Tak to bych ucinil za dost racionalizaci.
A co se control tyce, $form->addXXX se mi kdyz to pouzivam taky moc nelibi a spis bych dal prednost kompozici, $form->add( ….), prave proto abych nemusel mit god object container, a moh to mit tak jak to zhruba popisujes ze to ma symfony.
Jo uvidime jak nette 3 dopadne

bene

$form->add(...) respektive $builder->add('name', Text::class, [...options...]), tak to řeší Symfony. Type (v Nette Control) jsou samostatné třídy/služby. Bez PhpStorm respektive bez napovídání klíčů pro options to není moc konfortní. Dá se to ale přežít, neboť většinou opakuješ ty samé klíče, tudíž si je zapamatuješ a když zadáš neplatný, zařve ti to, tudíž chybu neuděláš.

Co se rozšířitelnosti macro/filter/funkce týče, mám s Twigem lepší zkušenost než s Latte. A pokud neřešíš n makra tak, pominuli „drobné“ rozdíly v syntax, nejde o žádnou výraznou změnu (co se šablon samotných týká)

Oldisy3

ještě mám dotaz, dá sse v symfony udělát formulář se snippetama bez manuálního renderu?

bene

Bohužel té otázce nerozumím, můžeš uvést příklad?

Symfony má default render v twigu pro formy v několika variantách (div layout, bootstrap 3, 4, table) a můžeš si přetížit globálně/lokálně celý type (control) nebo jen konkrétní type v daném formu.

Dobře je to popsané zde:

Srigi

P.S.: V dávné době jsem doporučoval Nette, …, ale z toho sešlo, protože Nette DI trpí koncepční chybou.

Toto by ma zaujimalo, mohol by si v rychlosti napisat o co ide?

bene

Nette DIC lze zkompilovat přímo do vygenerované PHP třídy (řetězec). Ten jsi schopen pak evalem vykonat, aniž by jsi musel zapsat na disk, ale je to celé tak nějak nemotorné. Pokud lze kompilovat bez generování třídy, pak se omlouvám za mystifikaci, zdrojáky jsem podrobně neprocházel.

class Foo
{
    public function bar(): string
    {
        return 'bar';
    }
}

$generator = function (Compiler $compiler) {
    $builder = $compiler->getContainerBuilder();
    $builder->addDefinition('foo')
        ->setFactory(Foo::class)
    ;
};

$class = 'MyContainer';
$compiler = new Compiler();
$compiler->setClassName($class);
$generator($compiler);
$code = $compiler->compile();

eval($code);

$container = new $class;

$foo = $container->getService('foo');
echo $foo->bar(); // "bar"

Nepamatuji se, jestli byl tenkrát Compiler zvlášť (kompilace do třídy bez zápisu na disk) neprocházel jsem zdrojáky. To vedlo k problémům např. v testech (proto jsem extension nedokonočil).

Daleko logičtější je kompilovat DIC nezávisle na generování PHP třídy. Pro vygenerování PHP třídy mít serializer, který serializuje již zkompilovaný DIC.

Takto se to dělá v Symfony:

$builder = new ContainerBuilder();

$builder->register('foo')
    ->setClass(Foo::class)
    ->setPublic(true)
;

$builder->compile();

$foo = $builder->get('foo');
echo $foo->bar(); // "bar"

Je více věcí, které se mi v Nette DIC nelíbí. Např. že se třída nastavuje přes metodu setFactory, když ten kód čtu, nerozumím mu, je to matoucí. Toto je třeba prkotina, jiné jsou docela zásadní, ale raději už to vypisovat nebudu.

David Grudl

Fenomenální je to neuvěřitelné množství energie, které lidé vkládají do zdůvodňování a racionalizace proč všechno kolem Nette je špatně.

Dokonce i taková fajn věc, jako že komunita kolem Nette pro něj ochotně hlasovala v anketě magazínu SitePoint, stejně vede k tomu, že se najde kritik, co je znechucen tím, že mám odkaz na anketu na svém vlastním webu. To je opravdu fascinující, opovržením Čechů ze všeho českého.

Vždyť je to absurdní. Dám vedle sebe dva šablonovací jazyky, jeden má zjevně jednodušší syntax a prvenství v ve vymýšlení způsobů, jak se dá předcházet bezpečnostním dírám, druhý je složitější a bezpečnost tak moc zdaleka neřešil, ale nikdy si v žádné diskusi nepřečtu nic jiného, než že ten první je úplně špatnej.

Svět českého OS je svět naprosté nepodpory, pohrdání, snahy všech dostat každého, kdo se jen pokusí něco zajímavého vytvořit, zpět na kolena. Sám jsem k Nette velmi kritický, ale bohužel když žiji v prostředí, kde nic jiného než kritičnost není, kde se musím neustále sám obhajovat, ve zcela hostilním prostředí, tak tam volání po vetší kritičnosti prostě neberu. Kritičnost je mor Čechů.

David Grudl

A teď mi prosím napište, že nebrečím :-)

Děcka, my bysme mohli být tak šikovný národ, ale bohužel se tak nesnášíme, že nemáme šanci.

Kolemjdouci

To proto ze open source je komunismus co nefunguje

oss

To pre to, ze OSS komunita (aspon v CR a SK) je cisty komunizmus a nabozensky fanatizmus v jednom. Sklamal som sa v nej uz velakrat.

Oldisy3

Zrovna šablonovací systém na nette mám rád (možná pozůstatek po smarty) syntaxe je jednodušší, nevim koho to napadlo v twigu psát {{ a }}.
nadruhou stranu se domnívám že latte toho řeší zase až zbytečně moc, svádí to k psaní bussines logiky do šablon.

Jakub Podhorský

to je jednoduchý. Snadný přechod s Jinja2.

Oldisy3

Zase i ta kritičnost má svá pozitiva, výsledky jsou dovedené k dokonalosti.

Martin Hassman

Pod zdánlivou kritičností se snadno a nezřídka skývají jiné motivy, mnohem horší. Taková snaha poškodit, ublížit, znemožnit, paralyzovat a mnohé další. Bez hlubší znalosti problematiky a osob není snadné je identifikovat. Kdybychom to dokázali, bylo by to zajímavé a mohli bychom odhalit, zda ona lokálně zvýšená kritičnost je opravdu vyšší snaha o opravu chyb (nápravu problémů) anebo jen nárůst oněch patologických případů, které v součtu dělají ledacos jiného jen ne pomáhání.

Oldisy3

ano snadno, ne zřídka, no jednou sem na to v jedné práci narazil, měl sem takového šéfa který apriori odmítal všechno co nevymyslel, ale kdyby alespon neco vymyslel.
Jenze to je problém že dneska sou všichni snowflake a za všim se hledají nějaké jiné motivy i když tam nejsou.

lenoch

Musím říct, že ačkoliv mi ta první reakce přišla dost neadekvátní, tak v tomhle Davida Grudla úplně chápu. Ten neustálý negativismus a shazování musí být pekelně frustrující a demotivující.
Něco jiného jsou konstruktivní připomínky ve stylu: Líbilo by se mi, kdyby tam bylo ještě tohle. Chybí mi tohle, co má framework xxx, to bychom docela potřebovali, nebo proč y funguje takhle – nebylo by to lepší tak?
Za Nette je zjevně obrovská spousta práce, David dělá opravdu skvělé přednášky a ani komunita na tom není tak špatně – i když pochopitelně světově rozšířený framework bude mít vždycky větší ekosystém.
A ne, nejsem placený z žoldu Nette. :)

bene

Tak to je velmi špatně pochopeno. Je samozřejmě fajn, že Češi dávají hlas svému oblíbenému českému frameworku. Důvod proč jsem na to poukázal je, že článek Tomáše Votruby byl přirovnán dosti hanlivě k reklamě na pilulky na hubnutí. A pokud na tom Davide (snad nevadí tykání) trváš, pak já trvám na tom, že chlubit se třetím místem v takové anketě je to samé. Šlo mi pouze o přirovnání, nic víc.

Dále jsem nesrovnával šablonovací jazyky, jen jsem tak nějak předjímal kam by se debata ohledně security issues ubírala. Slyšel jsem ji už mockrát a opravdu toto nikoho v Twigu netrápí. Latte má fajn věci o tom žádná, přesto preferuji Twig z několika důvodů (některé už nemusí být platné). A souhlasím Twig je více ukecaný. Nicméně to mě díky autocomplete moc netrápí. Twig plugin do PhpStormu je udržovaný. Pro Latte je poslední update Jul 01, 2016. Pamatuji, že mi to napovídalo deprecated makra a to pak tu menší ukecanost úplně zabije.

Tomas

Ono to s tou ceskou nesnasenlivosti asi nebude tak horke, kdyz se dari vybirat penize. Nebo to jsou zahranicni darci?Delam v hodne velke java firme a ta by nikomu neda ani dolar. Skoro mam pocit ze by radeji investovala do zmeny technologie nez nekomu dobrovolne prispivat.

Oldisy3

právě součást české hyperkritické kultůry je hyperkritičnost vůči hyperkritičnosti.

Martin Hassman

To je posilující se kruh. Jedno vyvolává druhé.

Vojtěch

Máte nějaké srovnání z hlediska performance? Na kterém z frameworků běží aplikace rychleji ap.?

TomasVotruba

Tento faktor pro nás nebyl důležitý, takže jsme ho neměřili a při používání aplikace si ničeho nevšimili. Oba frameworky používají DI container, který se cachuje, tam defakto rozdíl není.

bene

K tomu bych dodal, že Symfony cachuje i routování (v obou směrech), navíc ho v předposlední verzi více optimalizovali, viz. https://symfony.com/blog/new-in-symfony-4-1-fastest-php-router
Pokud si dobře pamatuji, Nette trpí výkonnostním problémem při velkém množství rout a tuším, že chce cachovaní také zavést (otázkou je, ve které verzi, možná už je, pak sorry).
Samotný Symfony kernel je docela light. Nepřekvapilo by mě, kdyby si výkonnostně polepšili.

Ostatně by to mohlo být zajímavé srovnání a nemělo by být složité. Stačí lokálně spustit verzi před a po. Do nějakého presenteru/controlleru dát statický response (abychom měřili jen odpověď frameworku), vybuildit cache a pak poslat několik stovek dotazů za sebou a zprůměrovat.
Možná to přesvědčí ty kdo s přechodem ještě váhají :) (toto roztomilé rýpnutí jsem si nemohl odpustit)

Pavel Vosyka

Koukám, že Entry.do už nějak nejede. Třeba se jen přejmenovali, ale takhle s odstupem času to článku dodává nový rozměr :-D

Jan Mikeš

Ahoj, ano, společnost Entrydo jsme prodali :-).

Pavel Vosyka

Díky za zprávu. Tak se zdá, že ho migrace úplně nepohřbila, to je fajn slyšet, a možná mu to i přidalo na hodnotě (zvlášť pokud by to bylo do zahraničí). Nevíš jestli funguje projekt dál?

Enum a statická analýza kódu

Mám jednu univerzální radu pro začínající programátorty. V učení sice neexistují rychlé zkratky, ovšem tuhle radu můžete snadno začít používat a zrychlit tak tempo učení. Tou tajemnou ingrediencí je statická analýza kódu. Ukážeme si to na příkladu enum.

Pocta C64

Za prvopočátek své programátorské kariéry vděčím počítači Commodore 64. Tehdy jsem genialitu návrhu nemohl docenit. Dnes dokážu lehce nahlédnout pod pokličku. Chtěl bych se o to s vámi podělit a vzdát mu hold.