Zkušenosti z upgradu z 0.9 na 2.0

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
kukulich
Člen | 58
+
0
-

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 z Nette\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() na isLoggedIn(), login()logout()
  • Přejmenování metody Nette\Security\Identity::getName() na getId(), takže getIdentity()->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#L66https://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 na url
  • 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 :)

Jan Tvrdík
Nette guru | 2595
+
0
-

Nebojte se připojit vlastní zkušenosti.

Patrik Votoček
Člen | 2221
+
0
-

kukulich napsal(a):

  • @{include $content} nahrazeno za {block #content}

Spíš za {include #content} :-)

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
+
0
-

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
+
0
-

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 | 1834
+
0
-

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
  • Debug::logExceptionDebugger::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
+
0
-

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')