RobotLoader nenaťahuje Dibi
- srigi
- Nette Blogger | 558
Tusim od sobotnej nightly verzie Nette Framework (php 5.3) nefunguje takyto jednoduchy konštrukt:
app\
...
libs\
Dibi\
drivers\
libs\
Nette\
dibi.php
netterobots.txt
Nette\
document_root\
app/bootstrap.php
// ...
dibi::connect(Environment::getConfig('database'));
// ...
Vyhadzuje to
Fatal Error
Class 'dibi' not found
Cela ladenka je tu. Mozete si vsimnut, ze vobec nie je includnuty subor
libs/Dibi/dibi.php
. V predslych verziach (nightly cca 2 tyzdne
dozadu) vsetko fungovalo ako malo – robotLoader natahoval Dibi
automaticky.
Fixnut sa to da v app/config.ini
service.Nette-Loaders-RobotLoader.factory = Nette\Configurator::createRobotLoader
service.Nette-Loaders-RobotLoader.option.directory[] = %appDir%
service.Nette-Loaders-RobotLoader.option.directory[] = %libsDir%
service.Nette-Loaders-RobotLoader.option.directory[] = %libsDir%/Dibi
service.Nette-Loaders-RobotLoader.run = TRUE
To je ale IMO sproste riesenie, ked uz je RobotLoader, tak nech robi svoju pracu ako ma. Cely problem si mozete nasimulovat – stiahnite si nejaky aktualny nightly build, pouzite skeleton a do bootstrabu pridajte horeuvedeny riadok.
- srigi
- Nette Blogger | 558
Bohuzial nemozem potvrdit opravu
(const REVISION = '9ad3175 released on 2010-09-20'
). Obycajny
skeleton (z aktualneho nightly build), +horeuvedeny riadok, +nejake config
direktivy – vid sample download.
Bolo by fajne, keby chybu potvrdil este niekto iny. Ja ju mam sice potvrdenu na dvoch masinach, ale obe su moj oblubeny Arch linux.
- srigi
- Nette Blogger | 558
Myslim, ze som na to „kápol“ (slovaci odpustite). Vsetko funguje OK, ak
su libky natvrdo nahrate do %libsDir%
. Prestane to chodit ak je
Dibi nasymlinkovane (na tom ci je Nette symlinkovane
nezalezi):
/srv/www/lib/Dibi/v1.0-dev/dibi/
Nette/
drivers/
...
/srv/www/lib/Nette/v1.0-dev/framework/
Application/
Caching/
...
/srv/www/vhosts/projects/npokus/
app/
document_root/
libs/
dibi -> /srv/www/lib/Dibi/v1.0-dev/dibi/
Nette -> /srv/www/lib/Nette/v1.0-dev/framework/
Tak to teda neviem ako David bude ladit na windooze. Myslim, ze rovnaky problem bude aj s inymi symlinkovanymi libkami (Zend, etc.) ale nemam cas to overovat.
edit: opraveny text, pridany priklad
Editoval srigi (21. 9. 2010 11:30)
- David Grudl
- Nette Core | 8227
Izolujme to od RobotLoaderu. Projde ti touto strukturou Finder? (např.
Finder::find('*')
). Já jsem ho se symlinky testoval jak na Linuxu,
tak na NTFS a všude to fungovalo.
Pokud ne, ověř prosím, co tivrací objekt SplFileInfo pro dotyčné symlinky a metody isDir() a isFile().
- Filip Procházka
- Moderator | 4668
<Directory /var/www/...>
Options FollowSymLinks
</Directory>
tohle všechno apache a filesystem ok ?
- PaBi3
- Bronze Partner | 62
Mne po úpravách momentálne RobotLoader hlási nasedovnú chybu: http://ukaz.at/w4
- Proki
- Člen | 66
Mám stejný problém jako PaBi3, po dnešním updatu na nejnovější Nightly Builds (rev. 14130f4) je tato třída nenalezena. Při zkoumání cache RobotLoaderu jsem zjistil, že se tato třída nějakým způsobem ignoruje a do cache se nezaregistruje. Problém mám v prefixed verzi pro PHP 5.2, jinou verzi jsem nezkoušel.
- David Grudl
- Nette Core | 8227
Už vidím, kde je problém. Na Windows se flock chová fakt hodně divně. Opravím…
- Ondřej Mirtes
- Člen | 1536
Taky hlásím problém, vypadá to, že RobotLoader neprochází symlinky.
EDIT: Provedl jsem teď nějaké testování a začal to dělat commit, ve kterém RobotLoader začal používat Nette\Finder. Takže chyba bude asi v něm.
- David Grudl
- Nette Core | 8227
Zjistil jsem, že SPL souborové iterátory se chovají na různých místech dosti různě. Potřeboval bych ověřit následující opravu: v metodě Finder::select() zkuste nahradit
return (!$type || $file->getType() === $type)
...
za
return (!$type || ($type === 'dir' && $file->isDir()) || ($type === 'file' && $file->isFile()))
...
- Proki
- Člen | 66
Můj problém to nevyřešilo (Fatal Error – class Nette\Tools not found). Toto ale určitě nesouvisí se symlinky, jelikož používám Windows a všechny knihovny mám přímo nakopírované v adresáři libs.
Pro nasimulování tohoto stavu stačí přidat do template skeletonu např.
následující kód: Datum: {=2010-01-01 |date}
Tato chyba nastává pouze v případě, kdy nechám RobotLoader zaindexovat i soubory z Nette, při použití NetteLoaderu je vše v pořádku.
- srigi
- Nette Blogger | 558
Oprava zafungovala na test kode. Bohuzial ale Nette projekt este nenatahuje symlinkovane kniznice.
- Filip Procházka
- Moderator | 4668
Mi pro změnu vůbec nenatahuje adresář libs
service.Nette-Loaders-RobotLoader.factory = "Nette\\Configurator::createRobotLoader"
service.Nette-Loaders-RobotLoader.option.directory[] = %appDir%
service.Nette-Loaders-RobotLoader.option.directory[] = %libsDir%
service.Nette-Loaders-RobotLoader.run = TRUE
service.Nette-ITranslator.factory = "NetteTranslator\\Gettext::getTranslator"
service.Nette-ITranslator.run = TRUE
testováno pomocí register_shutdown_function
register_shutdown_function(function() {
dump(\Nette\Environment::getApplication()->getService("Nette\\Loaders\\RobotLoader")->getIndexedClasses());
});
Dokud jsem nezakomentoval ITranslator a nezkusil vytvořit instanci v bootstrapu tak mi RobotLoader z libs vůbec nic nechtěl načíst a v seznamu tříd načtených RobotLoaderem prostě Gettext nebyl
Nechápu to, chová se to jak ucpané trubky, nedaří se mi to replikovat
Každopádně jsem měl problém co se týče
Nette\Tools::enterCriticalSection
, chtěl po mě nadefinovat
define('TEMP_DIR', WWW_DIR . '/../temp');
ocenil bych kdyby to žralo tempDir
z configu
//P.S.: nevím jestli to nějak pomůže, ale snad je to k tématu…
- David Grudl
- Nette Core | 8227
Už je v tom trošku bor…nepořádek.
Ad problém s Nette\Tools
: vyskytoval se na Windows (resp.
NTFS), byl způsobem zamykáním a měl by být vyřešen v poslední revizi
(použití TEMP_DIR nyní prosím neřešme). V tomhle tématu už o něm ani
slovo, ok?
Ad procházení: nahradil jsem funkci getType() za isDir() & isFile(),
mělo by to tedy rozeznávat i symlinky.
Zdá se, že tu je ještě problém v tom, že neumí do symlinkovaných
adresářů vstoupit. Tento problém vyřeší přidání flagu
RecursiveDirectoryIterator::FOLLOW_SYMLINKS. Problém je, že FOLLOW_SYMLINKS
existuje teprve od PHP 5.2.11, takže pro starší verze udělám fixlý
RecursiveDirectoryIterator.
V poslední verzi by mělo být vše opravené.
- Filip Procházka
- Moderator | 4668
poslušně hlásím že symlinky i zkrz různé partitions na linuxu fungují (snad) :)
- Honza Marek
- Člen | 1664
David Grudl napsal(a):
Tento problém vyřeší přidání flagu RecursiveDirectoryIterator::FOLLOW_SYMLINKS. Problém je, že FOLLOW_SYMLINKS existuje teprve od PHP 5.2.11
Já mám 5.3.0 a tady to taky není.
- danik
- Člen | 56
ha, mne robotloader taky netaha dibi… uz nad tim sedim asi dve hodiny a porad nechapu… vypada to zatim pro me skoro jako kdyby ani configurator netahal robotloader… normalne mam dibi nahranou v ./libs/dibi , ./libs je v konfiguraci pridana do robot loaderu a porad nic… vzdavam se, pomoc, prosim!!
Bootstrap:
<?php
use Nette\Diagnostics\Debugger,
Nette\Application\Routers\SimpleRouter,
Nette\Application\Routers\Route;
require LIBS_DIR . '/Nette/loader.php';
Debugger::$strictMode = TRUE;
Debugger::enable('213.192.30.1');
$configurator = new Nette\Configurator;
$configurator->loadConfig(__DIR__ . '/config.neon');
$application = $configurator->container->application;
/* tady se jeste nastavuje router, nijak nesouvisi s problemem */
$application->onStartup[] = function() use ($configurator) {
// a na nasledujicim radku dostavam "Fatal error: Class 'dibi' not found"
dibi::connect($configurator->container->database);
};
$application->run();
?>
Jeste config:
<?php
common:
php: # PHP configuration
date.timezone: Europe/Prague
session.save_path: "%tempDir%/sessions"
zlib.output_compression: yes
default_charset: "UTF-8"
services:
robotLoader:
option:
directory: [%appDir%, %libsDir%]
run: true
production < common:
database:
driver: mysql
host: localhost
username: ehm
password: ehm
database: ehm
development < common:
console < common:
?>
dodal bych ze mam verzi 2.0-dev released on 2011–05–28
Editoval danik (14. 6. 2011 3:16)
- temistokles
- Člen | 8
V configu prepíš „services“ na „service“. Zjavne sme čerpali z rovnakého zdroja a tiež ma to stálo pár hodín…