Zkušenosti z upgradu z 0.9 na 2.0
- kukulich
- Člen | 58
Před dvěma týdny jsem upgradoval jeden větší projekt z Nette 0.9.3 na Nette 2.0. Zkusím zde lehce sepsat svoje poznatky a zkušenosti. Berte prosím na vědomí, že některé věci možná nejsou aktuální pro upgrade z verze 0.9.7. Zabralo mi asi 8 hodin, aby vše fungovalo, pak už jsem si jen hrál s novinkami.
- Přejmenování všech tříd :)
$context->parameters
je pole, ale k prvkům zNette\Environment::getConfig()
se dalo přistupovat jako k objektu. To dost komplikuje přechod z Environment na Context- Metoda
Nette\Forms\Form::getValues()
vracíNette\ArrayHash
, dříve vracela pole. Pole je třeba vynutit přes parametr. Rozdíl je poznat, když pak používáte nějaké array_* funkce. - Nette\Forms\Form->onSubmit changed its behavior; use onSuccess instead.
- Nette\Application\UI\Presenter::terminate() is not intended to send a Application\Response; use sendResponse() instead.
Nette\Application\UI\Presenter::$invalidLinkMode
už není statické, ačkoliv dokumentace tvrdí, že ano https://doc.nette.org/…n/presenters#…- Změnila se deklarace metod
Nette\Application\UI\Presenter::formatLayoutTemplateFiles()
,formatTemplateFiles()
,createTemplate()
. Při jejich dědění je třeba přidat parametr$class
- Přejmenování metod
Nette\Security\User::isAuthenticated()
,authenticate()
,signOut()
naisLoggedIn()
,login()
alogout()
- Přejmenování metody
Nette\Security\Identity::getName()
nagetId()
, takžegetIdentity()->id
nevrací id z pole $data ale identifikátor - Jinak se definují vlastní makra
- Jinak se vyhledávají šablony a layouty, především když jsou součástí modulu
@{include $content}
nahrazeno za{block #content}
- Některé
{include}
v kombinaci s{block #content}
přestaly fungovat - Makro
{ifset}
vyžaduje jako koncovou značku{/ifset}
, nestačí{/if}
- Makro
{ifCurrent}
vyžaduje jako koncovou značku{/ifCurrent}
, nestačí{/if}
– Navíc je trochu matoucí porovnání zdrojáku a dokumentace, zda je makro zastaralé nebo ne: https://github.com/…UIMacros.php#L66, https://latte.nette.org/cs/tags#… {assign}
mělo trochu jinou syntax než{var}
Nette\Utils\Arrays::get()
dřív nevyžadovalo zadání třetího parametru- Helper
escapeUrl
se přejmenoval naurl
- Zrušena bez náhrady třída
HashTable
- Zrušena bez náhrady metoda
Nette\Http\Request::getPostRaw()
Zastaralé metody
- Nette\Http\Request::getUri() is deprecated; use Nette\Http\Request::getUrl() instead.
- Nette\Http\Url::getAbsoluteUri() is deprecated; use Nette\Http\Url::getAbsoluteUrl() instead.
- Nette\Http\Url::getHostUri() is deprecated; use Nette\Http\Url::getHostUrl() instead.
- Nette\Application\UI\Presenter::redirectUri() is deprecated; use Nette\Application.\UI\Presenter::redirectUrl() instead
- Nette\Forms\Container::addFile() is deprecated; use addUpload() instead.
- Nette\Forms\Controls\SelectBox::skipFirst() is deprecated; use setPrompt() instead.
Podle zdrojáku Nette je takový změn mnohem víc, ale já jsem narazil pouze na tyhle.
Navíc na hraní
- Změna ini konfigurace na neon
- Přejmenování .phtml na .latte
- Používání DI a služeb
Na závěr můžu říct, že pro projekt, který chcete dál vyvíjet, se rozhodně upgrade vyplatí. Není to zas tak náročně a už po dvou týdnech můžu říct, že nás to hodně nakoplo směrem dopředu, abychom spoustu věcí dělali lépe a radostněji :)
- Patrik Votoček
- Člen | 2221
kukulich napsal(a):
@{include $content}
nahrazeno za{block #content}
Spíš za {include #content}
:-)
- Makro
{ifCurrent}
vyžaduje jako koncovou značku{/ifCurrent}
, nestačí{/if}
– Navíc je trochu matoucí porovnání zdrojáku a dokumentace, zda je makro zastaralé nebo ne: https://github.com/…UIMacros.php#L66, https://latte.nette.org/cs/tags#…
Zastaralé je mělo by se používat:
<a n:href=":Homepage:default" n:class="$presenter->linkCurrent ? current">Homepage</a>
{* resp.: *}
<li n:class="$presenter->isLinkCurrent(':Homepage:default') ? current">
<a n:href=":Homepage:default">Homepage</a>
</li>
- kukulich
- Člen | 58
- Makro
{ifCurrent}
vyžaduje jako koncovou značku{/ifCurrent}
, nestačí{/if}
– Navíc je trochu matoucí porovnání zdrojáku a dokumentace, zda je makro zastaralé nebo ne: https://github.com/…UIMacros.php#L66, https://latte.nette.org/cs/tags#…Zastaralé je mělo by se používat:
<a n:href=":Homepage:default" n:class="$presenter->linkCurrent ? current">Homepage</a> {* resp.: *} <li n:class="$presenter->isLinkCurrent(':Homepage:default') ? current"> <a n:href=":Homepage:default">Homepage</a> </li>
Mám nějaké podezření, že $presenter->linkCurrent
mi
vůbec nefungovalo. Taktéž mi myslím nefungovalo
$presenter->isLinkCurrent(':Homepage:*')
, což s makrem
funguje.
Navíc se přiznám, že to makro mi přijde v šabloně jako mnohem hezčí řešení než volání funkce.
- Patrik Votoček
- Člen | 2221
kukulich napsal(a):
Mám nějaké podezření, že
$presenter->linkCurrent
mi vůbec nefungovalo.
Funguje pomocí „last link“ tj. funguje pouze za předpokladu že je
$presenter->linkCurrent
voláno až po samotné tvorbě
odkazu.
Taktéž mi myslím nefungovalo
$presenter->isLinkCurrent(':Homepage:*')
, což s makrem funguje.
Wildcard u currentu je dlouhodobý problém který Nette trápí (ani nevím jestli se to do 2.0 stihlo opravit).
Navíc se přiznám, že to makro mi přijde v šabloně jako mnohem hezčí řešení než volání funkce.
Souhlasím jsou situace kdy se to hodí víc. Většinou se ale
ifCurrent používá na CSS třídu a tato třída nebývá samotná
proto je vhodnější použití n:class
+ fce.
- hrach
- Člen | 1838
Provedl jsem u www.signaly.cz migraci na nejnovejsi nette (2.1) z roku a pul stareho nette. Nebylo to tedy 0.9, ale neco mezi. Pred pul rokem jsem provedl migraci jen formularu, takze nyni jsem s nimi neresil uz tolik problemu.
- pouzil jsem konverzni skripty, ktere plno veci ohlidali
- vsechny vyse zminene body jsem samozrejme musel zmenit (skriptem, rucne) taky
- bylo treba kompletne prepsat bootstrapy, konfigy apod; nebyla to takova sranda, protoze signaly pouzivaji nekolik behovych prostredi, 2 typy lokalnich vyvoju, routuji subdomeny jako blogy, atp.
- do DI jsem neprepisoval modelovou vrstvu, ale brzy na to prijde rada
- prepisovani sablon
- stara syntaxe
{var promenna obsah}
→{var $promenna = $obsah}
- ifCurrent pridat uzaviraci ifCurrent, to stejne ifset – neni cas prepisovat to vsechno na novy zpusob
- kompletni prepis vlastnich maker
- novy zpusob je pekny, ale v podstate jsem musel vsechno prepsat od zacatku
- pretizit snad vsechny form macros, ktere jsou ve stavajici implementaci nepouzitelne. aktualni verzi, co pouzivame je tu: https://gist.github.com/2009432
- if apod. se nesmi krizit, respektive mel jsem tak oifovany casti vypisu <form>u. Nastesti slo vyresit efektne pres define blocky.
{label endDate}
→{label endDate /}
, nastesti nebyla takova hruza, regular to prosel…- vyresit jinak ajax u dynamickych komponent, ktere meli cast sve sablony mimo svuj render. https://twitter.com/…063298080769
- stara syntaxe
Debug::logException
→Debugger::log
- jiny format error logu (parsujeme…)
Ve vysledku: cekal jsem to horsi, nicmene plno veci je zbytecne stale ohnutych – napr. @secured zabezpeceni. https://github.com/…tte/pull/469
Stesti bylo, ze jsem „spravne“ pouzivali ajaxove komponenty, takze nebylo treba tolik uprav, zamenil jsem pekne za UI\Multiplier a jelo to dal.
Z prevedu mj. vznikly take pullrequesty jako https://github.com/…tte/pull/551. Neslo to tedy prepsat hned napoprve.
Editoval hrach (10. 3. 2012 1:32)
- PetrP
- Člen | 587
V php 5.2 verzi se v Component::lookup odstraňovali namespace, takže šlo zapsat:
$component->lookup('Nette\Application\Presenter')
Je potřeba přepsat na:
$component->lookup('Presenter')