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 vNette\Application\Routers
- z AppForm se stal
Nette\Application\UI\Form
String
→Nette\Utils\Strings
aArrayTools
→Nette\Utils\Arrays
Finder
,Json
,Neon
,Paginator
aHtml
jsou nyní taky vNette\Utils
(třídaTools
už není)Nette\Mail\Mail
→Nette\Mail\Message
- prostor
Nette\Templates
přejmenován naNette\Templating
ITranslator
je nyní v prostoruNette\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:
Debug
→Debugger
,String
→Strings
,ArrayTools
→Arrays
,MultiRouter
→RouteList
aDownloadResponse
→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
Jiří Knesl #1
Davide, myslím, že s namespaces (a Dependency Injection) přišel dřív Flow3.
Edke #2
Idem nato, som zvedavý, ako konverzia dopadne :)
Edke #3
#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úť 🙂
Patrik Votoček #4
#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
Edke #5
David Grudl #6
#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 😉
Tento článek byl uzavřen. Už není možné k němu přidávat komentáře.