Nette 2.0 a nové namespace

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

Aktuálně: Nové jmenné prostory v Nette

Na jabberu se nám začínají množit dotazy typu „nette 5.3 – 2.0 mi nenajde tridu mail use Nette\Mail\Mail;“. A tak zakládám tohle vlákno abych měl kam odkazovat…

Nette prošlo před pár dny celkem radikální změnou namespace viz: https://forum.nette.org/…announcement Takže pokud jste narazili na problém s neexistující třídou / namespace je to nejspíše, protože jste aktualizovali Nette z verze před změnou na verzi po změně.

Aby byl přechod co nejvíce usnadněn tak máte dvě možnosti:

Aliasy

Použít aliasy a to tak že includnete script (v distribučním balíku tools/Code-Migration/compatibility-aliases.php).
 app/boostrap.php

<?php
/**
 * My Application bootstrap file.
 */

use Nette\Debug;
use Nette\Environment;
use Nette\Application\Route;

// Load Nette Framework
// this allows load Nette Framework classes automatically so that
// you don't have to litter your code with 'require' statements
require LIBS_DIR . '/Nette/loader.php';

// includneme aliasy
require LIBS_DIR . '/compatibility-aliases.php'; //případně jiné místo kam jste si script zkopírovali

Přepis

Přepsat na nové namespace (ušetříte si tím práci v budoucnu). Naštěstí jde přepis automatizovat a to pomocí scriptu (který opět najdete v distribučním balíku tools/Code-Migration/class-updater.php).
Stačí ho spustit:

php tools/Code-Migration/class-updater.php -d /cesta/k/myApp

kde /cesta/k/myApp nahradíte za cestu ke složce kde chcete provést úpravy. Skript běží v read-only režimu (jen píše, které soubory by změnil), aby skutečně změny prováděl, přidejte ještě parameter -f.

Nezapomeňte si před použitím zazálohovat své zdrojové kódy a ověřit zda vše proběhlo v pořádku.

Bonus

Takovou třešničkou na dortu je převodník z PHP 5.2 Nette na namespace Nette (také najdete v distribučním balíku tools/Code-Migration/migrate-53.php).
Opět stačí spustit:

php tools/Code-Migration/migrate-53.php -d /cesta/k/myApp

kde /cesta/k/myApp nahradíte za cestu ke složce kde chcete provést úpravy. Skript běží v read-only režimu (jen píše, které soubory by změnil), aby skutečně změny prováděl, přidejte ještě parameter -f.

Nezapomeňte si před použitím zazálohovat své zdrojové kódy a ověřit zda vše proběhlo v pořádku.

Přeji hodně štěstí v užívání nového Nette Frameworku!

David Grudl
Nette Core | 8221
+
0
-

Dal jsem parameter -f bokem, aby to lidé nejprve raději pouštěli bez ně.

Patrik Votoček
Člen | 2221
+
0
-

no já to pustil bez něj a strašně se divil proč mě git hlásí 0 změn. musel jsem pátrat až pak mě to došlo. je to takové trochu WTF

jtousek
Člen | 951
+
0
-

Možná by bylo lepší vyžadovat nějaký parameter, např. -f pro zápis a -r pro read-only režim. Pokud by to někdo spustil bez parametru tak by mu vyskočila nápověda.

David Grudl
Nette Core | 8221
+
0
-

Bez parametrů nápověda vyskočí. Jde o to, že parameter -f je bezpečnostní pojistka.

jasir
Člen | 746
+
0
-

Nějak se blbě překládá ten form:

-use \Nette\Application\AppForm;
-use \Nette\Forms\Form;
+use Nette\Application\UI\Form;
+use \Nette\Forms\Nette\Forms\Form as Form_; //tady je nesmysl
David Grudl
Nette Core | 8221
+
0
-

fixed

Filip Procházka
Moderator | 4668
+
0
-

Nejsem si jistý jestli by to do toho mělo patřit, ale bylo by super kdyby Code-migration nahrazoval i Tools::createDatetime za Datetime::from, criticalSection, mimeType, …

David Grudl
Nette Core | 8221
+
0
-

Jo, to by mohlo jít.

plasmo
Člen | 66
+
0
-

Jenom tu je problém, při přepisu vyskočí tahle chyba:

ClassUpdater version 1.0
------------------------
PHP Fatal error:  Class 'Nette\Utils\Tokenizer' not found in /home/petr/Nette/tools/Code-Migration/class-updater.php on line 498

Editoval plasmo (17. 5. 2011 12:47)

Jan Tvrdík
Nette guru | 2595
+
0
-

Patrik Votoček wrote:

Takovou třešničkou na dortu je převodník z PHP 5.2 Nette na namespace Nette (také najdete v distribučním balíku tools/Code-Migration/migrate-53.php).

Nepřevede Presenter, Environment, Route, Html a určitě i další.

David Grudl
Nette Core | 8221
+
0
-

To je divný, kde se ty třídy vytratily…

xr
Člen | 94
+
0
-

nejaky fix v dohladnej dobe? nette\utils\tokenizer neexistuje, ale aj po oprave skriptu na nette\tokenizer stale narazam na dalsie chyby – skript sa snazi zapisovat do nedeklarovanej premennej Tokenizer::$ignored, tento riadok som odstranil, dlasi error:

Call to undefined method PhpParser::createToken()

uz nemam chut sa v tom dalej vrtat … DataGrid sa uz niekolko hodin snazim sprevadzkovat s php 5.3 namespases a nic … fail

P.S.: samotny skript vytvara v suboroch (podla pola $replaces) neexistujuce menne priestory – konkretne nette\UTILS\string a nette\UTILS\ARRAYS

Filip Procházka
Moderator | 4668
+
0
-

Datagrid máš funkční zde: https://github.com/…nts/DataGrid

Jan Tvrdík
Nette guru | 2595
+
0
-

David Grudl wrote:

To je divný, kde se ty třídy vytratily…

To já nevím, já sem doufal, že tebe něco napadne :)

David Grudl
Nette Core | 8221
+
0
-

Už je to snad ok.

Peter
Člen | 12
+
0
-

Class updateru se má zadávat relativní, nebo absolutní cesta?

Při relativní cestě tam tohle dělá neplechu:

<?php
$this->fileName = ltrim(str_replace($folder, '', $file), '/\\');
?>

nestačí to nahradit za tohle?

<?php
$this->fileName = basename($file);
?>
Jan Tvrdík
Nette guru | 2595
+
0
-

Pokud si člověk není jist, zda použít relativní nebo absolutní cestu, tak absolutní cesta má výrazně vyšší šanci, že bude fungovat :)

Peter
Člen | 12
+
+1
-

Tak proč to neudělat pohodlnější?

A koukám, že se to týká i code checkeru… takže by k tomu skoro patřila vlaječka feature request.