Na navigaci | Klávesové zkratky

Translate to English… Ins Deutsche übersetzen…

Nové jmenné prostory v Nette

Společně s vydáním Nette Framework 2 beta dochází k úpravě jmenných prostorů a názvů tříd. Je jasné, že přejmenovávání nepatří mezi populární úpravy, nicméně snažil jsem se udělat vše pro to, aby přechod byl bezbolestný.

Jaké jsou vlastně důvody?

Nette Framework je dost možná prvním PHP frameworkem na světě, který používání jmenných prostorů zavedl. Kvůli prodlevám s vydáním PHP 5.3 se začaly v praxi používat docela pozdě a tudíž mají stále svou první a dnes již historickou podobu. Ta neodpovídá současnému stavu frameworku, navíc pojmenování tříd bylo často ovlivněno kompatibilitou s verzí PHP 5.2. Před vydáním nové verze frameworku je záhodno stav napravit.

Zpětná kompatibilita

Úpravy se týkají především verze frameworku pro PHP 5.3. Ve verzích pro 5.2 dochází jen k drobným změnám, a to proto, aby se zbytečně nerozevíraly nůžky mezi 5.3 a 5.2 verzemi.

Nejspíš by k tak radikálním krokům ani nedošlo, kdyby nebylo možné přechod zcela zautomatizovat. K dispozici proto máte skript, který všechny změny ve vašich zdrojových souborech udělá za vás! Najdete jej v distribučním balíku v tools/Code-Migration/class-updater.php.

Parametry pro spuštění:

php class-updater.php -d /cesta/k/app [-f]

kde /cesta/k/app nahradíte za skutečnou cestu ke složce s vašimi zdrojovými soubory. Pokud neuvedete nepovinný parameter -f, skript běží v read-only režimu a jen vypíše, které soubory by změnil.

DŮLEŽITÉ UPOZORNĚNÍ: nezapomeňte si před použitím zazálohovat zdrojové kódy a po konverzi ověřit porovnáním, zda záměny proběhly v pořádku.

Skript vyžaduje pro spuštění PHP 5.3 a najdete jej jen v 5.3 balíku. Lze pomocí něj konvertovat všechny verze Nette Framework (tj. pro 5.3 i pro 5.2).

Pokud z nějakého důvodu nemůžete soubory aktualizovat, můžete využít aliasování tříd. Stačí ve své aplikaci hned po načtení frameworku načíst skript compatibility-aliases.php, který najdete opět v tools/Code-Migration. Příklad v bootstrap.php:

// načteme framework
require LIBS_DIR . '/Nette/loader.php';

// načteme aliasy
require LIBS_DIR . '/compatibility-aliases.php';

Nette\Debug::enable(); // fungují původní názvy tříd

Aliasování funguje pouze pro Nette Framework ve verzi pro PHP 5.3.

Pravidla pojmenování

Novou podobu názvů tříd jsem chtěl podřídit, jako v podstatě vše v Nette, pohodlí programátora. Jak ukázala řada diskusí, subjektivní požadavky mohou být rozporuplné. Pro někoho znamená pohodlí mít co nejkratší názvy tříd, pro jiného jsou to názvy co nejvíce popisné. Přehled myšlenek, ze kterých se vycházelo, najdete v článku Best practices pro jmenné prostory v PHP.

Nyní by všechny třídy měly mít výstižný název i bez uvedení jmenného prostoru, preferovány jsou kratší názvy a lze pěkně využít parciální namespaces:

use Nette\Http; // alias pro namespace

// dostupné jsou všechny třídy via Http:
$request = new Http\Request;
$response = new Http\Response;

Nová struktura pro 5.3

Nejlépe si novou strukturu můžete prohlédnout přímo v API dokumentaci. Důležité změny jsou tyto:

  • výjimky, které byly bez namespace, jsou nyní v prostoru Nette
  • Nette\Debug je teď Nette\Diagnostics\Debugger (což je dlouhé, zvažuje se alias např. NDebug)
  • Presenter & Control jsou ve jmenném prostoru Nette\Application\UI, routery v Nette\Application\Routers
  • z AppForm se stal Nette\Application\UI\Form
  • StringNette\Utils\Strings a ArrayToolsNette\Utils\Arrays
  • Finder, Json, Neon, Paginator a Html jsou nyní taky v Nette\Utils (třída Tools už není)
  • Nette\Mail\MailNette\Mail\Message
  • prostor Nette\Templates přejmenován na Nette\Templating
  • ITranslator je nyní v prostoru Nette\Localization
  • úložiště pro cache jsou v Nette\Caching\Storages
  • low level komponenty jsou v Nette\ComponentModel

Jak bylo vysvětleno výše, nemusíte se přechodu obávat, konverzi za vás udělá utilitka.

Nová struktura pro 5.2

Zde jsou důležité vlastně jen tyto změny:

  • DebugDebugger, StringStrings, ArrayToolsArrays, MultiRouterRouteList a DownloadResponse → FileResponse

A pak ještě několik tříd, konverzi opět udělá utilitka.

Přechod na verzi 5.3 se jmennými prostory

PHP ve verzi 5.2 je zatím stále podporováno, ale rozhodně doporučujeme aktualizovat na verzi pro PHP 5.3 se jmennými prostory. S migrací vám pomůže nový nástroj tools/Code-Migration/migrate-53.php. Příkazová řádka i všechny upozornění jsou stejné, jako v případě nástroje class-updater.php. Enjoy!

Komentáře

  1. Jiří Knesl http://www.knesl.com #1

    avatar

    Davide, myslím, že s namespaces (a Dependency Injection) přišel dřív Flow3.

    před 6 lety
  2. Edke #2

    avatar

    Idem nato, som zvedavý, ako konverzia dopadne :)

    před 6 lety | reagoval [3] Edke
  3. Edke #3

    avatar

    #2 Edke, No tak migrácia musím povedať takmer bezproblémová, jedina konštrukcia, ktorá nebola zachytená class-updater-om bolo rozšírenie triedy \Nette\Forms\Container cez Reflections a to method name ako reťazec:

    Nette\Forms\Container::extensionMethod(
    ‚\Nette\Forms\Container::addAppFile‘,
    array(‚Nette\Forms\AppFile‘, ‚addAppFile‘));

    Ináč musím povedať, že bezproblémov, môj aktuálne najväčší projekt už beží pod novými Nette Namespaces :)

    Teraz ostáva si už len na ne zvyknúť :-)

    před 6 lety | reagoval [4] Patrik Votoček
  4. Patrik Votoček http://patrik.votocek.cz #4

    avatar

    #3 Edke, to bude tím že namespace se v řetězci uvádí vždy jako full-class tudíž se neuvádí počáteční lomítko

    před 6 lety
  5. Edke #5

    avatar
    [smazáno] Ešte jedna pripomienka, zišlo by sa na github-e repo, ktoré by bolo vyskladané z jednotlivých repo's (nette, tools, sandbox, examples …) ako submodulov a štruktúrou by kopírovalo stiahnuteľný balík z nette.org. Je mi jasné, že by asi postrádalo minifikovanú verziu, ale možno aj to by sa dalo poriešiť cez git hooks.

    před 6 lety | reagoval [6] David Grudl
  6. David Grudl http://davidgrudl.com #6

    avatar

    #5 Edke, to se mi potřebné nezdá, takže to nechám na jednotlivých uživatelích Gitu si takové repo vyrobit. Každopádně offtopic prosím do fóra ;-)

    před 6 lety

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