Interface pro addony a autoregistrace

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

Co takhle zavést nějaký interface pro registraci rozšíření Nette, kterou by (Robot)Loader mohl automaticky zavolat? Hodně doplňků tuhle tichou konvenci dodržuje už teď (hlavně teda panely).

Většinou mám v projektu tak 5–6 rozšíření Nette a nechce se mi to vypisovat.

namespace Nette;

interface Addon
{
	public static function register();
}
kravčo
Člen | 721
+
0
-

Problémom je, ako Robotloader zistí, že to má zavolať? Mohol by to zistiť pri načítaní triedy, ale kedy ju načíta, keď ju v tvojom prípade nikde nepoužiješ?

nanuqcz
Člen | 822
+
0
-

Nemyslím, že zrovna RobotLoader by měl k tomuhle sloužit, ale jako nápad obecně je to určitě super.

Sám jsem si ve svojem CMS napsal třídu, která hledá všechny presentery s rozhraním IExtension a volá jejich metody installExtension() a setupRouter(), abych to nemusel všechno psát do bootstrapu (i když se nejedná o Addony, ale o presentery, jde vlastně o stejný princip).

Možná na to napsat třídu třeba AddonRegister a v bootstrapu pak volat jen AddonRegister::register() ? Byl by to Nette addon pro registraci ostatních addonů :-D
U jakéhokoli nápadu v tomto stylu jsem pro ;-)

Filip Procházka
Moderator | 4668
+
0
-

Proč třídu? Stačí interface.

nanuqcz
Člen | 822
+
0
-

HosipLan napsal(a):

Proč třídu? Stačí interface.

Teď jsem trochu mimo… a třídy, implementující tohle rozhraní, se samy zavolají jak? Možná mi uniká nějaká další z magických vlastností PHP :-)

EDIT: už tě možná chápu, pořád bereš tu možnost, že ten NazevAddonu::register() zavolá RobotLoader?

Editoval xxxObiWan (26. 4. 2011 11:52)

Mikulas Dite
Člen | 756
+
0
-

kravčo napsal(a):

Problémom je, ako Robotloader zistí, že to má zavolať? Mohol by to zistiť pri načítaní triedy, ale kedy ju načíta, keď ju v tvojom prípade nikde nepoužiješ?

To je problém, ale co s tím? Chtěl jsem to zjišťovat přes reflexe, ale ty tu třídu načtou. Šlo by addony dát do samostatného adresáře, ale to není úplně perfektní.

Další (skoro ideální) možnost je dát je do společného namespace, třeba namespace Addons;. Pokuď se registrují, zpravidla využívají extensionMethod, tzn. s addonem přímo se většinou nepracuje.

Mikulas Dite
Člen | 756
+
0
-

xxxObiWan napsal(a):

Nemyslím, že zrovna RobotLoader by měl k tomuhle sloužit, ale jako nápad obecně je to určitě super.

Souhlas, mělo by to dělat něco vedle.

Sám jsem si ve svojem CMS napsal třídu, která hledá všechny presentery s rozhraním IExtension a volá jejich metody installExtension() a setupRouter(), abych to nemusel všechno psát do bootstrapu (i když se nejedná o Addony, ale o presentery, jde vlastně o stejný princip).

A nahrával jsi do paměti i to, cos nepoužil? Což minified Nette dělá taky, ale příde mi to jako zbytečná škoda.

Možná na to napsat třídu třeba AddonRegister a v bootstrapu pak volat jen AddonRegister::register() ? Byl by to Nette addon pro registraci ostatních addonů :-D

Jo, to by šlo, ale klidně by se to mohlo registrovat samo ; ).

nanuqcz
Člen | 822
+
0
-

Mikulas Dite napsal(a):

Sám jsem si ve svojem CMS napsal třídu, která hledá všechny presentery s rozhraním IExtension a volá jejich metody installExtension() a setupRouter(), abych to nemusel všechno psát do bootstrapu (i když se nejedná o Addony, ale o presentery, jde vlastně o stejný princip).

A nahrával jsi do paměti i to, cos nepoužil? Což minified Nette dělá taky, ale příde mi to jako zbytečná škoda.

setupRouter() volám vždycky a u všech presenterů a tak je i nahrávám do paměti (do pole $router[] v bootstrapu – pokud jsi to myslel takhle). Jinak to nejde, nemůžu totiž dopředu vědět, které routy budou potřeba, tak je musím načíst všechny.

Pokud jde o installExtension(), tak to volám jen jednou (do cache ukládám, co už jsem zavolal a co ne)


Obecně bych byl i pro to, aby Nette podporovalo i automatické načítání presenterů, jako to dělá ta moje třída. (chystám se jí dát do Addonů, ale ještě je potřeba (hodně) poladit výkon).

Editoval xxxObiWan (26. 4. 2011 12:38)

Mikulas Dite
Člen | 756
+
0
-

Automatické načítání presenterů máme, resp. stará se o to RobotLoader nasměrovaný do APP_LIB. Šlo mi o to, že abys volal installExtension, musíš naincludovat tu třídu. Abys věděl, jestli má vůbec metodu installExtension, musíš mít minimálně její reflexi a to už musí být zavedená.

nanuqcz
Člen | 822
+
0
-

Automatické načítání presenterů máme, resp. stará se o to RobotLoader nasměrovaný do APP_LIB.

Myslel jsem spíš automatické načítání rout presenterů (třeba přes metodu setupRouter, abych to nemusel psát do bootstrapu). To zatím Nette nemá. A jestli jo a já jsem si na to psal kódy zbytečně… :-D

Šlo mi o to, že abys volal installExtension, musíš naincludovat tu třídu. Abys věděl, jestli má vůbec metodu installExtension, musíš mít minimálně její reflexi a to už musí být zavedená.

Právě tohle musím doladit :-) chystám se všechno o těch třídách cachovat (i výsledné routy), takže nakonec je budu muset naincludovat jen jednou a pak se všechno bude brát z cache. Ale možná jsi zase myslel něco jiného :-)

Jinak zjišťuju to jednoduše – pokud daná třída implementuje moje rozhraní IExtension, tak má i tyto metody.

Filip Procházka
Moderator | 4668
+
0
-

PresenterTree jsem použil velice jednoduchý princip, který by šel ještě malinko zoptimalizovat, ale to už je drobnost.

  • spustí se služba a zkontroluje, jestli se cache robotloaderu nějak nezměnil od předchozího spuštění
    • pokud se změnil, tak vytvořím nový index
  • na požádání přečte a poskytuje seznam tříd s určitými vlastnostmi (presentery)

Šlo by to zobecnit, aby to vyfiltrovalo třídy, podle určitých kritérií (implementuje interface, dědí od třídy, …)

Takhle se, stejně jako v robotloaderu, třídy načtou jen jednou, když přibudou do indexu a navíc to bude ve stejném requestu, jako se načítá robotloader a index se uloží.

Mikulas Dite
Člen | 756
+
0
-

Jo to vypadá výborně, máš to pěkně vymyšlený : ) Mrknu na to a zkusim to nějak nasadit.