Analyza suboru s vyuzitim nette reflexie
- greggy
- Člen | 14
Ahojte,
pokúšam sam spraviť aplikáciu, ktorá rozanalyzuje php súbory. Konkrétne
ide o ORM Entity, ktoré sú v projekte s nette frameworkom (každá trieda
dedí od Nette\Object). Chcel som na to využiť samostatný skript, ktorý by
bol spúšťaný z príkazového riadku. Ten by pomocou reflexie zistil
všetko, čo o triede potrebujem vedieť (názov, fieldy, metódy a k ním
príslušné anotácie). Skúšal som použiť ReflectionClass, problém však
bol, že nepoznal objekty Nette. Chcel by som teda využiť reflexiu, ktorá je
implementovaná v nette. Podmienkou však je, že skript nesmie byť
súčasťou projektu. Viete mi poradiť ako by sa to dalo implementovať?
- Michal Vyšinský
- Člen | 608
Jestli-že na to chceš použít Nette reflexi, tak asi není nic jednoduššího než (viz Nette\Reflection\ClassType):
$class = new \Nette\Reflection\ClassType("NAZEV TRIDY");
- greggy
- Člen | 14
CherryBoss napsal(a):
Jestli-že na to chceš použít Nette reflexi, tak asi není nic jednoduššího než (viz Nette\Reflection\ClassType):
$class = new \Nette\Reflection\ClassType("NAZEV TRIDY");
Presne toto chcem použiť, ale ako to mám použiť? Kedže sú to v podstate 2 rozličné projekty. Mám použiť aj v tom skripte na analýzu nette knižnice? A potom nerozumiem ako získam prístup k tým entitám, tak aby som ich nemusel includovať, kedže neviem aké budú mať názvy a ich umiestnenie v súborovom systéme.
- Michal Vyšinský
- Člen | 608
No když to chceš dělat pomocí Nette, tak budeš muset Nette includnout. Osobně bych to udělal jako mini aplikaci kde by jsi si includnul nette/loader.php a pak nastavil RobotLoader podobně jako v bootstrapu. Tím se ti Nette postará o autoloading tříd.
- greggy
- Člen | 14
CherryBoss napsal(a):
No když to chceš dělat pomocí Nette, tak budeš muset Nette includnout. Osobně bych to udělal jako mini aplikaci kde by jsi si includnul nette/loader.php a pak nastavil RobotLoader podobně jako v bootstrapu. Tím se ti Nette postará o autoloading tříd.
Tak vytvoril som aplikáciu. Teraz už dokážem použiť reflexiu z nette. Ešte potrebujem načítať tie triedy, z toho druhého projektu. Myslel si to tak, že v robotloaderi pridám absolutnú cestu k tomu priečinku, kde sa nachádzajú tie triedy?
- Michal Vyšinský
- Člen | 608
Ano. RobotLoaderu předat cestu ke složce, kde chceš mít ony entity. Přes (Finder) bych si načetl veškeré *.php soubory a podle jejich názvu odvodil název třídy. V cyklu si je pak můžeš bez problému procházet a analyzovat.
- greggy
- Člen | 14
Neviem, či som to robil správne. Do súboru si cez parameter odovzdám cestu:
define('ENTITIES_DIR', $path);
v RobotLoadri:
require __DIR__ . '/../libs/autoload.php';
$configurator = new Nette\Config\Configurator;
$configurator->createRobotLoader()
->addDirectory(__DIR__)
->addDirectory(__DIR__ . '/../libs')
->addDirectory(ENTITIES_DIR)
->register();
A potom cez finder pristupujem k suborom:
foreach (Finder::findFiles('*.php')->from(ENTITIES_DIR) as $file) {
$fileName = basename($file);
$entityName = explode('.', $fileName);
$class = $entityName[0]; //nazov entity
$ref = new Nette\Reflection\ClassType($class);
}
Stále dostávam chybu:
ReflectionException #-1
Class Location does not exist
Location je názov súboru aj triedy.
Editoval greggy (15. 1. 2013 19:12)