RobotLoader nenaťahuje Dibi

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
srigi
Nette Blogger | 558
+
0
-

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.

David Grudl
Nette Core | 8227
+
0
-

Mělo by to být opravené.

srigi
Nette Blogger | 558
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-
<Directory /var/www/...>
Options FollowSymLinks
</Directory>

tohle všechno apache a filesystem ok ?

srigi
Nette Blogger | 558
+
0
-

Toto vsetko je OK, podobne aj prava na fajloch a foldroch. PHP open_basedir mam nad /srv/www. Vecer budem testovat tie veci co navrhuje David. Ako som pisal, zacalo to robit od istej verzie (tej co je v dist. trieda Finder).

srigi
Nette Blogger | 558
+
0
-

Spravil som tie testy s horeuvedenou strukturou. Tu je vysledok.

BTW problemovu masinu (notebook) donesiem na Webexpo.

Editoval srigi (22. 9. 2010 9:44)

PaBi3
Bronze Partner | 62
+
0
-

Mne po úpravách momentálne RobotLoader hlási nasedovnú chybu: http://ukaz.at/w4

David Grudl
Nette Core | 8227
+
0
-

To jsi asi nějak špatně uploadoval…

Proki
Člen | 66
+
0
-

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
+
0
-

Už vidím, kde je problém. Na Windows se flock chová fakt hodně divně. Opravím…

Ondřej Mirtes
Člen | 1536
+
0
-

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.

srigi
Nette Blogger | 558
+
0
-

Hodilo by sa premenovat temu (a nasledne zmazat tento post), lebo nejde len o kniznicu dibi ale vsetko symlinkovane.

David Grudl
Nette Core | 8227
+
0
-

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
+
0
-

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
+
0
-

Oprava zafungovala na test kode. Bohuzial ale Nette projekt este nenatahuje symlinkovane kniznice.

Filip Procházka
Moderator | 4668
+
0
-

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
+
0
-

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
+
0
-

poslušně hlásím že symlinky i zkrz různé partitions na linuxu fungují (snad) :)

srigi
Nette Blogger | 558
+
0
-

Potvrdzujem opravu. #good-job, #many-thanks :)

Honza Marek
Člen | 1664
+
0
-

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í.

David Grudl
Nette Core | 8227
+
0
-

fixed

oaki
Člen | 11
+
0
-

No mne to stale nejde, mam tento release 303b1cb released on 2010–09–24 a nic. Kde by mohol byt problem? Mam taky pocit, ze ked mi aktualizovali server na php 5.3.3, tak po prestalo ist. Teraz radsej nevymazavam temp:)

danik
Člen | 56
+
0
-

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
+
0
-

V configu prepíš „services“ na „service“. Zjavne sme čerpali z rovnakého zdroja a tiež ma to stálo pár hodín…

22
Člen | 1478
+
0
-

spíš bych doporučil update Nette na posledni verzi a services ponechat