Na navigaci | Klávesové zkratky

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 #1

    avatar

    Odkaz na fileinfo je chybný :)

    před 10 lety | reagoval [2] David Grudl
  2. David Grudl #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 10 lety
  3. Márius Rak #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 10 lety | reagoval [4] David Grudl
  4. David Grudl #4

    avatar
    před 10 lety
  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 10 lety | reagoval [6] David Grudl
  6. David Grudl #6

    avatar

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

    před 10 lety
  7. Jakub Vrána #7

    avatar

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

    před 10 lety | reagoval [8] Hrach
  8. Hrach #8

    avatar

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

    před 10 lety | reagoval [9] Jakub Vrána
  9. Jakub Vrána #9

    avatar

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

    před 10 lety
  10. Jakub Vrána #10

    avatar

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

    před 10 lety | reagoval [11] David Grudl
  11. David Grudl #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 10 lety
  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 10 lety | reagoval [13] David Grudl
  13. David Grudl #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 10 lety | 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 10 lety | reagoval [15] David Grudl
  15. David Grudl #15

    avatar

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

    před 10 lety
  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 10 lety | reagoval [17] David Grudl
  17. David Grudl #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 10 lety | reagoval [19] Radek
  18. David Grudl #18

    avatar

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

    před 10 lety
  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 10 lety | reagoval [20] David Grudl
  20. David Grudl #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 10 lety
  21. bckp #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ý 😁

    před 10 lety
  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 10 lety | 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 10 lety
  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 10 lety

Tento článek byl uzavřen. Už není možné k němu přidávat komentáře.


phpFashion © 2004, 2024 David Grudl | o blogu

Ukázky zdrojových kódů smíte používat s uvedením autora a URL tohoto webu bez dalších omezení.