RobotLoader a 2× definovaný class
- Patrik Votoček
- Člen | 2221
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
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
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
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
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
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
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)
- Patrik Votoček
- Člen | 2221
Bohužel tady to neplatí. Večer se pokusím zjistit kde přesně nastane problém a postnu sem report.
- Patrik Votoček
- Člen | 2221
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
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
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
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.