Nette a moduly, addony, bundly atd

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

Opět jsem začal dělat refactoring své aplikace a chci do ní něco „nového“ přidat a udělat ji čistější. Takže jsem udělal to že jsem úplně osamostatnil hlavní části které by mohly být společné pro vícero projektů takže jsem si udělal balíček „framework“ který je závislý pouze na samotném nette.

Z původního balíku jsem pak osamostatnil doplnění doctriny, mailovou knihovnu, formelementy atd. Vše by mělo tvořit samostatné balíčky tak aby případný jiný projekt mohl být z nich poskládán.

Zároveň se snažím nějak rozumně oddělit jednotlivé moduly co tvoří samostatný projekt (články, uživatelé, práva, atd.)

Co mě ale zatím vrtá v hlavě je samotné názvosloví. Přečetl jsem si jednotlivá řešení co zde místní guru uvádějí, projel jsem flame-frameworkflame-cms, koukal jsem taky na venne a i po přečtení návrhu Filipa Procházky mám stalé hokej v názvosloví jaké zvolit.

Pokud chápu dobře, bude se nette vyvíjet dále způsobem samostatných modulů a ve stejném duchu by se měly i vyvíjet aplikace, takže doplnění doctrine, mailový klient, webloader atd by měly být moduly. Ale jak pak tedy označit skutečné moduly tj. správa uživatelů, článků atd. ? Taky to označovat a přidávat stejně jako moduly a ve výsledku ty moduly označovat jako vizuální a nevizuální?

Bylo by dobré kdyby někdo to názvosloví konečně definitivně rozseknul a standartizoval ;)

pepakriz
Člen | 246
+
0
-

Venne sice nazývá rozšíření moduly, ale v podstatě to jsou klasické add-ony s vlastní CompilerExtension. Jediný rozdíl je v přítomnosti zavádějící třídy (https://github.com/…r/Module.php). Jinak název „modul“ byl zvolen hlavně pro větší srozumitelnost začátečníkům.

Jiří Nápravník
Člen | 710
+
0
-

Já to mám rozdělené na moduly, nehledal bych v tom nic složitého. I Zend má moduly a má tma jak vizuální věci, tak jen něco co například jen vylepší nějaké původní chování a je to na deset řádků… Jinak použvám Flame\Modules. A mám pak ArticleModule, UserModule etc.

akadlec
Člen | 1326
+
0
-

Takže vše pojmenovat mouduly ať už dělá vstup/výstup uživatele a nebo realizuje připojení k DB?

castamir
Člen | 629
+
0
-

Tak nějak intuitivně jsou moduly ucelené části aplikace např.:

  • administace
  • frontend
  • interní sekce (vyžaduje např. přihlášení uživatele)
  • cron
  • atd.

Se vším, co k nim patří tedy v případě nette jsou to presentery, šablony nebo třeba ještě komponenty specifické pro daný modul apod.

V aplikaci (obecně) pak používáš doplňky (addony/rozšíření) např. již zmíněný webloader nebo dibi a nebo třeba nextras/datagrid. Tohle jsou různé doplňky, které můžeš použít třeba i opakovaně v rámci jednoho modulu (několik datagridů nebo obecně komponent v administraci) nebo je použiješ klidně i ve více modulech. Některé (jako webloader) se používají na aplikaci jako celek. U něktrých doplňků je potřeba je „nainstalovat“, přesněji je správně nastavit v config.neon (viz webloader), jiné stačí nastavit jako službu (dibi) a jiné stačí do aplikace „nakopírovat“ (nebo lépe přidat přes composer).

honos
Člen | 109
+
0
-

To jsem take bylo resil a ve finale jsem to take vsechno pojmenoval module az na ty builtin zalezitosti jako je treba pripojeni k DB,.. takze mam AclModule, AuthorizationModule, NewsModule, BlogModule.Mam vlastne takovou obdobu fw ktera vyuziva NETTE fw, resp. je na nem zavisla, ten muj fw ma komponenty pro hodnoceni, komentovani atd. vyuzivajici bud model ktery jim nastavi modul nebo univerzalni model z meho fw kde staci pouze nastavit nazev tabulky (musi byt dodrzena urcita struktura). Tak treba pro komentovani apod. musi! vyuzivat builtin komponenty, to kvuli nasledne administraci: treba kolik je celkem komentaru na strankach apod. Ale celkove se mi to moc nelibi. Spis bych bral zalezitosti jako treba Authorization a User-Profile byli builtin.. Duvod? Stranka co nepovoluje prihlaseni je v podstate staticka a tudiz se vetsinou jedna o cisty html kod ktery ani nevyzaduje NETTE fw, staci dodrzet adresarovou strukturu pro spravne url. Authorizace ale je jednotna res authorizator je pouzit pouze pro prihlaseni ale ACL uz by mel byt modul pac jeden muze byt jednoduchy zatim co jiny slozitejsi a vyzadujici dalsi moduly treba GroupsModule.. No dop*** jak je to slozite na vysvetlovani.. Proste a jednoduse, je to zavisle na povaze aplikace! Pokud planujes naprogramovat vlastne takovou platformu na kterou pomoci modulu budes dinamicky vazat dalsi funkcionality je dobre mit nejake veci BUILTIN (treba prihlaseni, pripojeni k DB je uz ale zaklad o tom se nemusim zminovat) a jine jako moduly ale bach na zavislosti – je lepsi udelat vice verzi modulu (treba SimpleBlog – bez zavislosti, SimpleProfile – bez zavislosti, AdvancedBlog – se zavislosti treba na AdvancedProfile a AdvancedProfile by nemel uz ale byt vazan na zadny Modul resp mel by mit tabulku ve ktere jsou registrovany vsechny moduly co jsou na nem zavisly, to treba kvuli: kolik clanku ma uzivatel v blogu, prispevky uzivatele na forumu nebo obrazky uzivatel ve fotogalerii) …

akadlec
Člen | 1326
+
0
-

Tvé rozdělení na admin, front atd by se dalo aplikovat pro nějaký „malý“ rozsah ale v okamžiku kdy to chceš mít ucelené tak by tyto části měly imho byt vnořeny do hlavního modulu např. články a v něm až admin, front, cron atd.

Co ale řeším je zda to nějak dělit modul vs addon. Dejme tomu že si udělám „balík“ pro komunikaci s platební bránou. Ten se připojí k aplikaci, nastaví a přidá své služby. Jak je pak nazvat? Addon, modul? Jak řešit adresářovou strukturu? Ja to zatím udělal tak že je to prostě modul a zařadil jej nějak takto:

projekt
	app
		blog-module
			admin
			front
			...
		users-module
			...
	libs
		framework (uni třídy co rozšiřují nette)
		doctrine (doplnění doctrine do projektu)
		platebni-brana
	vendor
		nette
		kdyby

a mám tedy dva druhy modulů, ty co jsou uni a můžu je pak vzít a hodit do jiného projektu a ty co jsou appspecific které mají zadefinované prvky již konkrétní aplikace.

Je tedy toto pojmenování/rozdělení ok a v souladu s budoucím vývojem nette?

castamir
Člen | 629
+
0
-

Dá se to aplikovat i na velké projekty. Tvé libs a vendor jsou totéž. Oboje totiž nahraješ pomocí composeru, který ti všechny závislosti na jiných addonech/frameworcích (včetně samotného nette) pořeší.

Nette nijak nevyžaduje konkrétí adresářovou strukturu. Mapování namespace presenterů můžeš udělat v configu.

Připojení takového modulu je jen otázkou nekonfliktních rout, zajištění existence patřičných služeb v configu (pořeší compilerExtension) a fyzické přítomnosti závislostí (pořeší composer).

Takže v tomhle ti nette rozhodne nebude házet klacky pod nohy ;)

akadlec
Člen | 1326
+
0
-

libs a vendor nejsou totéž…vendor dělá composer, libs je sestaveno ručně. Ale zřejmě tady došlo k nepochopení otázky. Nejde mě o to co v nette lze či nelze, co dělá či nedělá composer. Jde mě o vyřešení otázky jak směřuje následný vývoj nete ať podle něj můžu ten projekt připravit.

honos
Člen | 109
+
0
-

Nette by se melo v budoucnu rozdelit na balicky po vzoru simfony.. Ostatne se o tom nekde na foru psalo, jinak tady mas vlakno tak se tam zkus optat..

castamir
Člen | 629
+
0
-

@akadlec: jsou totéž:

libs // vsechny zavislosti projektu
	composer // zavislosti zpracovane composerem
	cssmin // priklad rucne nactene zavislosti, kterou nactu treba robotloaderem

To, že se nette rozdělí do balíčků je v případě použití composeru blackbox, který na použití nette nic nezmění. Jen ti, kteří nepotřebují celý framework, budou moct sáhnout jen po vybraných částech. Nic víc.

Z hlediska struktury sandboxu by se nic měnit nemělo. Pořád platí, že nette zajímá víc to, které třídy pro presentery má použít, než fakt, kde leží.

Edit:
vendor složku v composeru lze změnit tak, aby se chovala výše uvedeným způsobem, následovně:

"config": {
    "vendor-dir": "libs/composer"
}

Editoval castamir (28. 1. 2014 12:37)

akadlec
Člen | 1326
+
0
-

Ach jo, tak sem mohl misto libs napsat magic tudíž že tam sou balíky co nemají s composerem co dělat, proto jejich oddělení a pak do budoucna přesun do balíků composeru. To že můžeš composeru říct kde to má rvát vím, šlo je a čistě vizuélní oddělení kódu co je přes composer a co je ručně.

Filip Procházka
Moderator | 4668
+
0
-

Začni používat tohle a máš po problému :) Co konkrétně na tom nechápeš?

akadlec
Člen | 1326
+
0
-

No tohle právě začínám používat, resp. koukam na řešení od jsifalda
Zřejmě jsem svůj dotaz položil špatně ;) Jde mě o to zjistit jakým směrem se vydat v samotné struktůře ať už filesystém a nebo namespaces. Jednoduše zda je správný směr to mít vše jako moduly, tj. vizuální moduly (BlogModule, AccountModule, AclModule,…) a pak ty co dělají svou práci jen na pozadí (Doctrine, Payments, FormElements, Webloader,…)

honos
Člen | 109
+
0
-

akadlec napsal(a):
Jednoduše zda je správný směr to mít vše jako moduly, tj. vizuální moduly (BlogModule, AccountModule, AclModule,…) a pak ty co dělají svou práci jen na pozadí (Doctrine, Payments, FormElements, Webloader,…)

To už by mělo být pouze na jednotlivci zda je pro něj pochopitelnější, a zda to vůbec chápat chce, že modul je ‚zobrazitelná‘ součást aplikace a extension je ‚systémová‘ součást aplikace a nebo je mu to jedno a všechno pojmenuje modul – jako třeba já :)

Ale co se týče třeba Webloader, FormElements to už by měli být spíše komponenty, tak jak jsou, aspoň myslím. Ale může to zapřičinit zmatek.. Navíc teď mě zrovna napadá že Webloader by měl být builtin funkcionalita pač ho nejspíš inicializuješ v BasePresenter.. ? Stejně tak Doctrine je služba, ne modul!! Zbytečně si motáš hlavu. Payments by rozhodně měla být extension pač se jedna o platební bránu kterou budou/můžou používat jiné moduly – v případě že je instalovaná.. promysli si co vlastně chceš naprogramovat.. udělej si celkový obrázek toho jakou aplikaci nebo platformu pro budoucí aplikace chceš mít.. Další vývoj Nette by rozhodně neměl zrušit dobře promýšlenou aplikaci a i kdyby náhodou ano snadno to napravíš.. veř mi, vím co píši, mě se nějakým zázrakem se celkem často poztrácejí nebo po rozházejí zdrojové kody na DEVu (starší PC :o)) ale během krátké chvilky to zas dam do kupy pač vím jak jsem to navrhoval: sám, bez řešeni třetích stran a s určitým záměrem (vím co ta platforma má dělat).. Ale u tebe se mi zda že nevíš.

akadlec
Člen | 1326
+
0
-

Tak co má platforma dělat vím, resp. ona už to dělá, jen ji zase proháním určitým refaktoringem. Proto jsem teď hlavní jádro celé appky rozbil na malé součásti které jsou nebo nejsou na sobě závislé podle typu.
No nějak se mi to podařilo zpětně rozchodit a nechám to zatím tak do následující fáze ;)

Filip Procházka
Moderator | 4668
+
0
-

Já v tom nevidím rozdíl. To že má rozšíření nějakou vizuální část imho není důležité. CompilerExtension použiješ ve vizuálním i nevizuálním. Pokud tam máš presentery, můžeš si zaregistrovat mapping, který ti nasměruje modul do správného namespacu. Komponenty zaregistruješ pomocí generovaných továrniček. A ostatní služby jsou brnkačka.

akadlec
Člen | 1326
+
0
-

jop takhle to dělám, resp zatím jen část. Možná otázka, je lepší ty konfigy házet do neonu nebo do DI extensiony?

Filip Procházka
Moderator | 4668
+
0
-

V CompilerExtension můžeš dodatečně načítat služby i z nějakého neonu, takže záleží čistě na tobě :)

Já to tak dělám ve své aplikaci, že mám poděděný CompilerExtension který modifikuje nette a načítá mi služby ze services.neon, který je hned vedle něj, ve stejné složce.

class MyExtension extends Nette\DI\CompilerExtension
{

	public function loadConfiguration()
	{
		$this->loadFile(__DIR__ . '/services.neon');
		$this->loadFile(__DIR__ . '/presenters.neon');

		// ...
	}



	private function loadFile($file)
	{
		$builder = $this->getContainerBuilder();
		$services = $this->loadFromFile($file);
		if (isset($services['parameters'])) {
			$builder->parameters = Nette\DI\Config\Helpers::merge($builder->parameters, $builder->expand($services['parameters']));
		}
		$this->compiler->parseServices($builder, $services);
	}

}
akadlec
Člen | 1326
+
0
-

No takhle to mám teď a koukal jsem na řešení to cele napsat v php. Ale jak tak na to koukám tak neon se píše rychleji ;)

Ale včera jsem narazil na jeden problémek. Původně jsem měl v hlavním neonu definice pro uživatele

services:
	user:
		class: System\Security\User
	nette.userStorage:
		class: System\Security\UserStorage

Teď jsem tyhle třídy převedl pod usermodule a tak chci tyto definice převést i neonu/konfigu daného modulu. Když jsem tedy zkusil přidat přes builder tak mě tracy řvala že to mám zadefinované dvakrát, jednou v hlavním a podruhé v modulu. Jak na to?

Filip Procházka
Moderator | 4668
+
0
-

Když registruješ služby do extension, měl bys je prefixovat aby ti nedocházelo ke konfliktům jmen. Osobně to dělám tak, že svoje služby registruju podle toho jak se to hodí (tedy například services.neon), ale když upravuju služby Nette nebo jiného rozšíření, tak to dělám pomocí ContainerBuilderu, například tady.

akadlec
Člen | 1326
+
0
-

jj ty služby prefixuju podle jména extension. Hele a to co máš v tom příkladu jsem právě zkusi, prvně jsem udělal remove ale stejnak mě to řvalo že to mám 2× registrované. Zkusím tedy znova ;)

E: uf asi musím lépe kontrolovat cache, protože jsem odkomentoval definici co se měl v extension a viola funguje ;)

Editoval akadlec (30. 1. 2014 19:42)