Analyza suboru s vyuzitim nette reflexie

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

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

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

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

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

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

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

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)

jiri.pudil
Nette Blogger | 1032
+
0
-

Není ta třída v nějakém namespacu?

greggy
Člen | 14
+
0
-

jiri.pudil napsal(a):

Není ta třída v nějakém namespacu?

Áno bolo to tým, ďakujem!