Na navigaci | Klávesové zkratky

Translate to English… Ins Deutsche übersetzen…

Nette Revolution 2.2

Asi největší revoluce v dějinách Nette, která se vás nijak nedotkne.

Poměrně krátce po vydání velké verze 2.1, která přinesla řadu vylepšení nejen ve formulářích, je tu další velká verze 2.2, která přichází s úplně novou infrastrukturou. Totiž původní repozitář Nette byl smazán rozdělen do 19 nových samostatných komponent: Application, Bootstrap, Caching, ComponentModel, Nette Database, DI, Finder, Forms, Http, Latte, Mail, Neon, PhpGenerator, Reflection, RobotLoader, SafeStream, Security, Tokenizer, Tracy a Utils.

(Podívejte se na video Kvadratura Nette.)

Co se tím mění pro vás, uživatele Nette Frameworku?

Takřka nic. Stále si můžete stáhnout celý framework nebo jej nainstalovat příkazem composer require nette/nette.

Ale zároveň máte možnost používat zcela samostatně šablonovací systém Latte, Laděnku (neboli Tracy), databázovou vrstvu a vlastně cokoliv.

Rozdělení frameworku do menších částí je trend, který už započalo například Symfony nebo Zend Framework 2. Nutnou podmínkou byl vznik respektovaného nástroje pro správu závislostí v PHP, kterým se stal Composer. Pokud si s ním zatím netykáte, neváhejte a seznamte se, není daleko doba, kdy se v PHP knihovny nebudou distribuovat jinak.

Nette se na rozdíl od Symfony nebo Zendu rozdělilo i fyzicky, což znamená, že každá komponenta má vlastní repozitář, issue tracker a číslování verzí. Zároveň každý repozitář obsahuje testy a všechny související soubory. Podívejte se například na Forms, kde najdete příklady použití v examples, v adresáři src/assets JavaScripty a v adresáři src/Bridges kód, který propojuje různé Nette komponenty. V případě formulářů jde o makra pro Latte.

Stejným způsobem jsou pak strukturovány všechny repozitáře.

Rozdělení frameworku je završením dvouleté práce, s cílem zachovat maximální kompatibilitu. Vlastně i proto zůstáváme u čísla verze 2. Jediným výrazným zásekem bylo oddělení Latte, což si vyžádalo přepracovat systém šablon, který v Nette existuje v takřka původní podobně od verze 0.8. Ale postupně:

Tracy

Laděnka byla přejmenována na Tracy, nemusíte se tak trápit s psaním šíleného Nette\Diagnostics\Debugger, nyní stačí Tracy\Debugger. Původní třída je z důvodu zpětné kompatibility stále funkční.

Pokud píšete doplňky, prefix názvů CSS tříd se změnil z nette- na tracy- a třída nette-toggle-collapsed na dvojici tracy-toggle tracy-collapsed. Původní třídy jsou u starých doplňku změněny na nové automaticky.

Latte

Šablonovací systém byl vždy poměrně úzce provázán s dalšími částmi frameworku, zejména třídami z jmenného prostoru Nette\Templating. Aby bylo Latte samostatně použitelné, bylo potřeba mu vymyslet nové snadno použitelné API, které se obejde bez těchto pomocných tříd. A vypadá takto:

$latte = new Latte\Engine; // nikoliv Nette\Latte\Engine
$latte->setTempDirectory('/path/to/cache');

$latte->addFilter('money', function($val) { return ...; }); // dříve registerHelper()

$latte->onCompile[] = function($latte) {
    $latte->addMacro(...); // when you want add some own macros, see http://goo.gl/d5A1u2
};

$latte->render('template.latte', $parameters);
// or $html = $latte->renderToString('template.latte', $parameters);

Jak vidíte, Latte si řeší samo načítání šablon a jejich kešování, čímž pádem původní FileTemplate a vlastně celý Nette\Templating z velké míry pozbývá na smyslu existence. Tyto třídy i nadále fungují a snaží se zajistit kompatibilitu s novým Latte, nicméně jsou zavržené. Ze stejného důvodu jsou zavržené i třídy Nette\Utils\LimitedScope, Nette\Caching\Storages\PhpFileStorage a služba templateCacheStorage.

Naopak Application přináší vlastní třídu Template (nahrazující FileTemplate a zajišťují kompatibilitu) a továrnu TemplateFactory, která rozšiřuje možnosti, jak v presenterech a komponentách pracovat se šablonami.

Ostatní

Třídy Nette\ArrayHash, ArrayList, DateTime, Image a ObjectMixin jsou nyní součástí balíčku Utils, proto i jejich namespace byl změněn z Nette na Nette\Utils. Obdobně Nette\Utils\Neon se stalo součástí balíčku Neon a bude mít namespace Nette\Neon\Neon. Aby změna byla transparentní, vytváří se pro tyto a některé další třídy tiše aliasy. Aliasy ostatních tříd vytváří Nette Loader spuštěný v loader.php a vypisuje přitom varování (abyste mohli svůj kód upravit). Pokud loader.php nepoužíváte (tj. instalujete Nette přes Composer), můžete Nette Loader načíst ručně třeba v bootstrap.php. Od RC4 se Nette Loader spouští vždy.

Alternativně je možné vytvořit v bootstrap.php rovnou všechny aliasy a obejít tak varování. Ale jelikož PHP při vytváření aliasů načítá zdrojový kód tříd, může to vést k mírnému snížení výkonu:

@array_walk(Nette\Loaders\NetteLoader::getInstance()->renamed, 'class_alias');

Zavržena (tj. stále funguje, jen vyhodí E_USER_DEPRECATED) je třída Nette\Utils\MimeTypeDetector, která od PHP 5.3 není potřeba, neboť ji plně nahrazuje rozšíření Fileinfo (pod Windows jej nezapomeňte zapnout v php.ini).

Byla zrušena podpora anotace @serializationVersion a dohledávání tříd pro vlastní anotace – tyto věci nebyly známé ani používané, ale měly negativní vliv na výkon.

A nakonec, chybné odkazy v šabloně nyní začínají hashem, tj. místo error:... se vypisuje #error:, aby když na takový odkaz omylem kliknete, browser nevypsal strašidelnou hlášku. Upravte si proto CSS.

Novinky

Verze 2.2.0 přichází i s řadou novinek.

Formuláře nyní přenášejí parametr do v POST datech, takže nebude strašit v URL. Přibyly nové validátory Form::MIN a Form::MAX. A do funkcí obsluhující událost onSuccess se nyní jako druhý parametr předávají hodnoty formuláře, takže ušetříte psaní $values = $form->getValues().

V databázi přibyla nová funkce fetchAssoc(). Můžete se podívat na pár příkladů použití v testech.

Anotace @inject nyní respektují aliasy definované pomocí use.

Pokud do data- atributů třídy Html vložíte pole, bude se serializovat do JSONu.

V souboru config.neon můžete jednotlivým uživatelů definovat také jejich role.

A přibyla nová třída Nette\Security\Passwords, která řeší hashování hesel.

Tip: nástroj na automatické přejmenování tříd.

Komentáře

  1. Petr Fidler http://www.petrfidler.cz #1

    avatar

    Odkaz na fileinfo je chybný :)

    před 3 lety | odpovědět | reagoval [2] David Grudl
  2. David Grudl http://davidgrudl.com #2

    avatar

    #1 Petře Fidlere, Díky. Protože tvůrci jednoho dementního prohlížeče, jehož název začíná na O, se rozhodli, že při kopírování URL do clipboardu budou vynechávat úvodní http:. Zabít málo :-)

    před 3 lety | odpovědět
  3. Márius Rak http://www.mariusrak.sk/ #3

    avatar

    Nette Database je niečo iné ako dibi? Zišiel by sa článok s porovnaním, prípadne schpná dokumentácia.

    před 3 lety | odpovědět | reagoval [4] David Grudl
  4. David Grudl http://davidgrudl.com #4

    avatar
    před 3 lety | odpovědět
  5. Tobiáš Potoček #5

    avatar

    Co když budu potřebovat dočasně vypnout cachování u Latte? Dříve stačilo nastavit jako cache DevNullStorage… bude Latte fungovat, když nenastavím temp directory?

    před 3 lety | odpovědět | reagoval [6] David Grudl
  6. David Grudl http://davidgrudl.com #6

    avatar

    #5 Tobiáši Potočku, stačí setTempDirectory() nenastavovat.

    před 3 lety | odpovědět
  7. Jakub Vrána http://php.vrana.cz/ #7

    avatar

    Kde je přesně definovaná metoda createAliases? V https://github.com/…teLoader.php jsem ji nenašel.

    před 3 lety | odpovědět | reagoval [8] Hrach
  8. Hrach http://skrasek.com #8

    avatar

    #7 Jakube Vráno, není v masteru, ale jen v 2.2.

    před 3 lety | odpovědět | reagoval [9] Jakub Vrána
  9. Jakub Vrána http://php.vrana.cz/ #9

    avatar

    #8 Hrachu, tak tam už to taky není…

    před 3 lety | odpovědět
  10. Jakub Vrána http://php.vrana.cz/ #10

    avatar

    Nicméně abych se dostal k pointě… Proč class_alias nezavolá autoloader při pokusu o nahrání třídy?

    před 3 lety | odpovědět | reagoval [11] David Grudl
  11. David Grudl http://davidgrudl.com #11

    avatar

    #10 Jakube Vráno, protože by nefungovalo $obj instanceof Stary\Nazev\Tridy.

    Vytváření aliasů momentálně obstarává aliases.php, ale jde stále o pracovní podobu.

    před 3 lety | odpovědět
  12. Shiro #12

    avatar

    Mně přestalo po zkusmé aktualizaci z 2.1 fungovat rozdělení aplikace v configu na production, common a development, resp. hlavně nevidí to už moji doctrine (kdyby) sekci pod těmito sekcemi… Je to tím, že je něco špatně na tomhle způsobu člěnění configu, nebo je chyba někde jinde (v kdyby/doctrine)? Po downgrade zpět na 2.1 funguje vše zase jak má.

    před 3 lety | odpovědět | reagoval [13] David Grudl
  13. David Grudl http://davidgrudl.com #13

    avatar

    #12 Shiro, vypisuje to nějakou chybu?

    Při použití sekcí je třeba u metody addConfig() uvést jako druhý parametr $configurator::AUTO. Dříve to Nette přecházelo, teď by mělo vypsat upozornění.

    před 3 lety | odpovědět | reagoval [14] Shiro
  14. Shiro #14

    avatar

    #13 Davide Grudle, Jo, to problém vyřešilo (teda už to aspoň píše error jinde :) ), jen IDE píše, že $configurator::AUTO je deprecated.
    Teď mám zase:

    Warning
    class_exists() expects parameter 1 to be string, object given („…/vendor/kdyby/events/src/Kdyby/Events/DI/EventsExtension.php:268“)

    …také to před updatem běželo bez problémů.
    Aliasy mám přes
    Nette\Loaders\NetteLoader::getInstance()->createAliases();
    v bootstrap.php a potom zaregistrovanou extension:
    Kdyby\Events\DI\EventsExtension::register($configurator);
    a dostávám tohle. Nevím zas, jestli je chyba v nette nebo v kdyby.

    před 3 lety | odpovědět | reagoval [15] David Grudl
  15. David Grudl http://davidgrudl.com #15

    avatar

    #14 Shiro, s EventsExtension bohužel neporadím, zkus se zeptat přímo Filipa Procházky.

    před 3 lety | odpovědět
  16. Radek #16

    avatar

    Obdivuhodný kus práce. Docela se na to těším. Abych však stíhal upgradovat – než doděláme projekt v 2.0.*, je tu 2.1 a hned 2.2 :-)

    Na první pohled zatím vidím, že mi bude chybět templateCacheStorage. Je nějaká šance tuhle část modularizovat? Máme zdrojáky na NFS a při větší zátěži rostou latence. Takhle se pro každou jednu šablonu volají dvě diskové IO operace (require zachytí opcache).

    před 3 lety | odpovědět | reagoval [17] David Grudl
  17. David Grudl http://davidgrudl.com #17

    avatar

    #16 Radku, Všechen kód zajišťující kompatibilitu mezi 2.1 a 2.0 je i ve 2.2, tudíž nejjednodušší je migrovat z 2.0 rovnou na 2.2.

    TemplateCacheStorage je stále součástí frameworku, ale ten ji sám o sobě už nepotřebuje (vyhazuje E_USER_DEPRECATED). Tudíž je nejlepší si tuto službu vytvořit sám třeba v config:

    services:
        templateStorage:
            - factory: Nette\Caching\Storages\PhpFileStorage('%tempDir%/cache')
            - autowired: no

    Možná ještě lépe si třídu Nette\Caching\Storages\PhpFileStorage zkopírovat do svého projektu pod vlastním namespace.

    před 3 lety | odpovědět | reagoval [19] Radek
  18. David Grudl http://davidgrudl.com #18

    avatar

    Aktualizoval jsem část týkající se vytváření aliasů.

    před 3 lety | odpovědět
  19. Radek #19

    avatar

    #17 Davide Grudle, Šablony cachuju do memcache avšak Latte\Engine počítá napevno s ukládáním do souborů. Asi bych mohl zkusit udělat vlastní Engine a ten aliasem podstrčit, raději bych však viděl storage modulární.

    před 3 lety | odpovědět | reagoval [20] David Grudl
  20. David Grudl http://davidgrudl.com #20

    avatar

    #19 Radku, kešování napevno do souborů je z důvodu mnohem vyššího výkonu (nevolá se eval). Předělat by to šlo asi jen vytvořením nějakého stream wrapperu.

    před 3 lety | odpovědět
  21. bckp http://www.kepak.eu #21

    avatar

    Doufám že to s Composerem není až tak pravda, na Nette se mi líbí právě jeho minifikovaná verze, kdy nahrání na server je otázkou chviličky… Představa že budu muset posílat všechny soubory mi není dvakrát příjemná…

    Jinak super práce s Nette 2.2, můžu říct že přechod z 2.0 i 2.1 je celkem jednoduchý, ač je pravda, že vývoj Nette je možná až příliš rychlý :-D

    před 2 lety | odpovědět
  22. dtx #22

    Hlavně těch změn, zase je plno věcí jinak. My pomalejší se sotva něco naučíme a už to můžeme zase zapomenout. Kdyby měl někdo tip na stabilnejší framework, tak .. tady ten tip asi stejně dlouho nevydrží ;)

    před 2 lety | odpovědět | reagoval [23] David G
  23. David G #23

    #22 dtxi, změn je dost, ale staré aplikace by měly fungovat. Na jakou nekompatibilitu jsi narazil?

    Stabilnější framework, to nevím, možná Rails… Třeba takový Zend a Symfony mezi první a druhou verzí byly nekompatibilní úplně ve všem.

    před 2 lety | odpovědět
  24. Pavel Kračík #24

    avatar

    Davide a NF hoši jste borci!!

    Ale je smutný, že vlastně všechno, co jsem se naučil a s čím jsem strávil desítky hodin v PHP/CSS/JS ve svém maličkém a hloupém Frameworku už jsou v Nette vyřešeny k dokonalosti. :( Takže si občas připadám, že už neprogramuju.

    Asi jako švec, co šil ručně boty a teď prodává v Tescu v Baťovi. :))

    před 2 lety | odpovědět

Zanechat komentář

Text komentáře
Kontakt

(kvůli gravataru)



*kurzíva* **tučné** "odkaz":http://example.com /--php phpkod(); \--