Nette a moduly, addony, bundly atd
- akadlec
- Člen | 1326
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-framework i flame-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
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
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.
- castamir
- Člen | 629
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
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
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
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
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.
- castamir
- Člen | 629
@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
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
Začni používat tohle a máš po problému :) Co konkrétně na tom nechápeš?
- akadlec
- Člen | 1326
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
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
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
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.
- Filip Procházka
- Moderator | 4668
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
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
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
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)