RobotLoader a 2× definovaný class

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

Pokud použiju klasickou definici RobotLoaderu:

<?php
$loader = new RobotLoader();
$loader->addDirectory(APP_DIR);
$loader->addDirectory(LIBS_DIR);
$loader->register();
?>

A náhodou se stane že mám někde 2× definován jeden class. Tak skončím fatal errorem hned na prvním volání classy která je mimo nette. Pokud ale za tuto definici přidám:

<?php
$loader->rebuild();
?>

Tak laděnka správně zařve že je 2× definován stejný class. Hodilo by se aby i bez $loader->rebuild() laděnka zařvala že je 2× definován stejný class.

PetrP
Člen | 587
+
0
-

Přesně nerozumím problému; metoda RobotLoader::addClass() by měla hlásit že se 2 třídy jmenují stejně, ona to nedělá? nebo je problém v něčem jiném a já to nepochopil.

Patrik Votoček
Člen | 2221
+
0
-

Oki pokusím se to vysvětlit jinak…
pokud v boot stratu zadám klasicky:

<?php
$loader = new RobotLoader();
$loader->addDirectory(APP_DIR);
$loader->addDirectory(LIBS_DIR);
$loader->register();
?>

Tak si to automaticky volá RobotLoader::addClass() ale v tomto případě z nějákého důvodu nevihodí vyjímku že jsou definovány 2 classy se stejným jménem. Pokud ale konstrukci pozměním/doplním takto:

<?php
$loader = new RobotLoader();
$loader->addDirectory(APP_DIR);
$loader->addDirectory(LIBS_DIR);
$loader->register();
$loader->rebuild();
?>

Tak už se vyjímka byhodí správně.

David Grudl
Nette Core | 8228
+
0
-

vrtak-cz napsal(a):
Tak laděnka správně zařve že je 2× definován stejný class. Hodilo by se aby i bez $loader->rebuild() laděnka zařvala že je 2× definován stejný class.

RobotLoader své chování optimalizuje pro rychlost, výsledky hledání cachuje, proto se chyby zjistí až po jeho registraci. Když budeš manuálně volat $loader->rebuild(), tak sice chyby odhalíš hned, ale aplikaci třeba 100× zpomalíš.

Patrik Votoček
Člen | 2221
+
0
-

To všechno chápu… A vím o tom. Ale problém je právě ten že když cache RobotLoaderu vyprší nebo ji smažu tak je výsledkem klasichá chyba při pokusu o volání classu který má robot loader načítat. V mém případě je to:

Fatal error: Class 'dibi' not found in D:\HomeWork\Workspace\Nella\app\bootstrap.php on line 86

Jelikož dibi mam v bootstrapu tak to nemám ani jako hezkej fatal error v laděnce ale klasicky. Pokud ale zapnu rebuild ručně (přidám $loader->rebuild()) tak RobotLoader vyhodí pěknou vyjímku v laděnce. To je to o co mě de. Pokud RobotLoader rebuiluje cache sám tak vyjímku nevyhodí ale pokud mu to na tvrdo řeknu tak ano. Nevím přesně proč se tomu tak dějě ale hodilo by se aby vyjimku vyhodil i když rebuild provádí sám. Už chápeme o co mě de?

Editoval vrtak-cz (25. 5. 2009 1:50)

David Grudl
Nette Core | 8228
+
0
-

Teď už je to srozumitelné. Jde o nějaký PHP bug. Možná jsem našel workaround, a doufám, že bude fungovat ve všech verzích.

Patrik Votoček
Člen | 2221
+
0
-

Super jdu to testnout…

PS: Asi to budu muset příště lépe formulovat…

Edit: Tak tě nepotěším… Právě doběhl update a testnul jsem to… Žádná změna pořád rovnou fatal error místo vyjímky z RobotLoaderu… :-(

PHP: 5.2.8 (XAMPP 1.7)

Editoval vrtak-cz (25. 5. 2009 5:25)

PetrP
Člen | 587
+
0
-

Vymazal sis temp?

(Mě to normálně funguje taky 5.2.8)

Editoval PetrP (25. 5. 2009 10:33)

Patrik Votoček
Člen | 2221
+
0
-

A jak bych asi jinak smazal cache RobotLoaderu?

PetrP
Člen | 587
+
0
-

;] tak práve o to mi slo. Jen mě napadlo jestli tady nebude platit pravido, že nejednoduší řešení je správné.

Patrik Votoček
Člen | 2221
+
0
-

Bohužel tady to neplatí. Večer se pokusím zjistit kde přesně nastane problém a postnu sem report.

David Grudl
Nette Core | 8228
+
0
-

Je to zajímavé, testoval jsem to na všech PHP od 5.2.0…

Patrik Votoček
Člen | 2221
+
0
-

Zajímavé než jsem začal testovat (asi před 10min) tak jsem stáhnul nejnovější nette už to funguje… Zajimave je taky to že nekřičí že je 2× definován jeden class ale že nemuže najít BasePresenter… :-/

Edit: Tak na to teď koukám a ono to řve i když tam ten po druhé definovaný class nemám. Jdu zkoumat proč. Chyba byla u mě.

Vše je při starém. Pořád to tu vyjímku nechce vyhodit. Zkoušel jsem před throw new … dát echo „xxx“; A to xxx mě to vypíše. Zkoušel jsem i trigger_error() a klasickou phpčkovou Exception ale pořád nic. Takže nevím co bych měl zkoušet dál. Jenom dodám že v bootstrapu mám:

<?php
//Enable RobotLoader
$loader = new RobotLoader();
$loader->addDirectory(APP_DIR);
$loader->addDirectory(LIBS_DIR);
$loader->register();

//Connect to database
dibi::connect(Environment::getConfig('database'));
?>

Takhle hnedka zasebou. Jediné jak docílit zobrazení laděnky je:

Debug::paintBlueScreen(new /*\*/InvalidStateException("Ambiguous class '$class' resolution; defined in $file and in " . $this->list[$class] . "."));

Ale pořád phpko nezaznamená tuhle exception. :-( pod laděnkou mám pořád:

Fatal error: Class 'dibi' not found in D:\HomeWork\Workspace\Nella\app\bootstrap.php on line 87

už fakt nevím jak na to. Nějáký nápad? co by se dalo ještě vyzkoušet? Jinak na 90% budu na PS tak by jsme mohly udělat live ladění.

Editoval vrtak-cz (26. 5. 2009 5:10)

Roman Ožana
Člen | 52
+
0
-

Mám úplně stejný problém (WAMP, PHP 5.2.8). Vrací mi to ‚dibi‘ not found – místo aby laděnka zařvala, že je nějaká třída definována 2×. Budu to ještě zkoumat, když mě něco napadne, tak se určitě ozvu.

Ondřej Brejla
Člen | 746
+
0
-

Stejný problém…hledal sem tu chybu pěkně dlouho. Po přidání $loader->rebuild() se vyhodí krásná vyjímka. Jinak nikolivěk, jen ošklivé Fataly o chybějících classech.

Nette rev. 392
PHP Version 5.2.6–3ubuntu4.1
Apache 2

h4kuna
Backer | 740
+
0
-

Zdravim, toto bude asi na Davida,

jestli to dobre chapu, tak RobotLoader uz nehlasi pokud ma nekdo dve stejnojmenne tridy z duvodu rychlosti?

Je mozne udelat jine chovani pro DEVELOPMENT a jine PRODUCTION?

Pac uz se mi to stalo asi trikrat a prohledavat 50 souboru kde jsem co zapsal podruhy.

David Grudl
Nette Core | 8228
+
0
-

Nene, hlásí to pořád.