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 Od RC4 se Nette Loader spouští vždy.loader.php
nepoužíváte (tj. instalujete
Nette přes Composer), můžete Nette Loader načíst ručně třeba v
bootstrap.php
.
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.
Komentáře
Petr Fidler #1
Odkaz na fileinfo je chybný :)
David Grudl #2
#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 🙂
Márius Rak #3
Nette Database je niečo iné ako dibi? Zišiel by sa článok s porovnaním, prípadne schpná dokumentácia.
David Grudl #4
#3 Máriusi Raku, dibi vs Nette Database
Tobiáš Potoček #5
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?
David Grudl #6
#5 Tobiáši Potočku, stačí
setTempDirectory()
nenastavovat.Jakub Vrána #7
Kde je přesně definovaná metoda createAliases? V https://github.com/…teLoader.php jsem ji nenašel.
Hrach #8
#7 Jakube Vráno, není v masteru, ale jen v 2.2.
Jakub Vrána #9
#8 Hrachu, tak tam už to taky není…
Jakub Vrána #10
Nicméně abych se dostal k pointě… Proč
class_alias
nezavolá autoloader při pokusu o nahrání třídy?David Grudl #11
#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.Shiro #12
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á.
David Grudl #13
#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í.Shiro #14
#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.
David Grudl #15
#14 Shiro, s EventsExtension bohužel neporadím, zkus se zeptat přímo Filipa Procházky.
Radek #16
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).
David Grudl #17
#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:
Možná ještě lépe si třídu
Nette\Caching\Storages\PhpFileStorage
zkopírovat do svého projektu pod vlastním namespace.David Grudl #18
Aktualizoval jsem část týkající se vytváření aliasů.
Radek #19
#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í.
David Grudl #20
#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.
bckp #21
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ý 😁
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ží ;)
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.
Pavel Kračík #24
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. :))
Tento článek byl uzavřen. Už není možné k němu přidávat komentáře.