Jak zpřístupnit nette prostředí z venčí (z jiné aplikace)

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

Mám nette aplikaci. Používám doctrine. Jsem v situaci, kdy potřebuji mít přístup k aplikaci „zvenčí“.
Praktický příklad: mám napsány entity a fasády k přístupu do db. V nette aplikaci s nimi běžně pracuji, ale potřebuji tyto entity a fasády využívat i vně aplikace.
Jde zavolat něco takového:

$container = require __DIR__ . '/../../../nette/app/bootstrap.php';
$container->getByType(Nette\Application\Application::class)
	->run();

$mojeFasada = $container->nejakSeTadyObjevMojeFasado();
$mojeFasada->vratMiVsechnyClanky();

Jen nevím, jestli je vůbec v současném nette s DI něco takového vůbec možné.
Případně prosím o radu, jak se s tímto problémem nějak jinak vypořádat než, jak to zamýšlím.
Díky

Tharos
Člen | 1030
+
+1
-

Možné to je a za mě jdeš správným směrem.

Jen bych se vykašlal na volání Application::run. To slouží jen k odbavení requestu. Skutečným srdcem aplikace není Application, nýbrž zinicializovaný DI kontejner. Takže stačí require bootstrapu, který kontejner správně zinicializuje, a pak už si z něj můžeš vytáhnout libovolnou z těch fasád atp.

Já podobně postupuji v některých akceptačních testech.

lvq
Člen | 47
+
0
-

Super, díky, zdá se že to funguje.
Fasádu si pojmenuji v neonu, abych ji potom našel, např:

services:
	myFacade: App\Model\Facades\MyFacade

a zavolám

$mojeFasada = $container->getService('myFacade');
Tharos
Člen | 1030
+
+1
-

Zdá se že to funguje.

Tak super. :)

Fasádu si pojmenuji v neonu, abych ji potom našel.

Buďto si ji pojmenuj, anebo ji z kontejneru vytáhni podle typu:

$mojeFasada = $container->getByType(MyFacade::class); // lze samozřejmě použít interface

Získávání podle typu je takové elegantnější, zejména pak v kombinaci s rozhraními.

Editoval Tharos (3. 10. 2016 9:36)

lvq
Člen | 47
+
0
-

To vyhledání podle typu se mně líbí taky víc, díky.