Moduli
Moduli vnašajo jasnost v aplikacije Nette, saj omogočajo enostavno razdelitev na logične enote.
Podobno kot pri urejanju datotek v mape na trdem disku, lahko v Nette predstavnike, predloge in druge pomožne razrede razdelimo v module. Kako to deluje v praksi? Preprosto z vključevanjem novih podimenikov v strukturo. Tukaj je primer strukture z dvema moduloma, Front in Admin:
app/ ├── UI/ │ ├── Admin/ ← Admin module │ │ ├── @layout.latte │ │ ├── Dashboard/ │ │ │ ├── DashboardPresenter.php │ │ │ └── default.latte │ │ └── ... │ ├── Front/ ← Front module │ │ ├── @layout.latte │ │ ├── Home/ │ │ │ ├── HomePresenter.php │ │ │ └── default.latte │ │ └── ...
Ta imeniška struktura se odraža v imenskih prostorih razredov, tako da se na primer DashboardPresenter
nahaja
v imenskem prostoru App\UI\Admin\Dashboard
:
namespace App\UI\Admin\Dashboard;
class DashboardPresenter extends Nette\Application\UI\Presenter
{
// ...
}
V aplikaciji se na predstavnik Dashboard
znotraj modula Admin
sklicujemo z uporabo zapisa
v dvopičju kot Admin:Dashboard
. Za njegovo akcijo default
se sklicujemo na
Admin:Dashboard:default
.
Predstavljena struktura ni toga; v konfiguraciji jo lahko v celoti prilagodite svojim potrebam.
Moduli lahko poleg predstavnikov in predlog vključujejo tudi vse druge datoteke, kot so komponente in pomožni razredi. Če
razmišljate, kam jih umestiti, razmislite o uporabi mape Accessory
:
app/ ├── UI/ │ ├── Admin/ │ │ ├── Accessory/ │ │ │ ├── FormFactory.php │ │ │ └── AdminLayout.php │ │ ├── Dashboard/ │ │ └── ...
Vgnezdeni moduli
Moduli so lahko vgrajeni na več ravneh, podobno kot struktura imenikov na disku:
app/ ├── UI/ │ ├── Blog/ ← Blog module │ │ ├── Admin/ ← Admin submodule │ │ │ ├── Dashboard/ │ │ │ └── ... │ │ ├── Front/ ← Front submodule │ │ │ ├── @layout.latte │ │ │ ├── Home/ │ │ │ └── ... │ ├── Forum/ ← Forum module │ │ └── ...
Modul Blog
je razdeljen na podmodula Admin
in Front
. To se odraža tudi v imenskih
prostorih, ki so nato prikazani kot App\UI\Blog\Admin
in podobno. Če se želimo sklicevati na predstavnik
Dashboard
znotraj podmodula Admin
, ga imenujemo Blog:Admin:Dashboard
.
Gnezdenje je lahko tako globoko, kot je potrebno, kar omogoča ustvarjanje podmodulov.
Če imate na primer v administraciji veliko predstavnikov, povezanih z upravljanjem naročil, kot so
OrderDetail
, OrderEdit
, OrderDispatch
itd., lahko ustvarite modul Order
,
v katerem bodo organizirani predstavniki, kot so Detail
, Edit
, Dispatch
in drugi.
Ustvarjanje povezav
Povezave v predlogah za predstavitev so relativne glede na trenutni modul. Tako povezava Foo:default
vodi do
predstavitvene predloge Foo
v istem modulu kot trenutna predstavitvena predloga. Če je trenutni modul na primer
Front
, potem povezava poteka takole:
<a n:href="Product:show">link to Front:Product:show</a>
Povezava je relativna tudi, če vključuje ime modula, ki se potem šteje za podmodul:
<a n:href="Shop:Product:show">link to Front:Shop:Product:show</a>
Absolutne povezave se zapišejo podobno kot absolutne poti na disku, vendar s podpičjem namesto šumnikov. Tako se absolutna povezava začne z dvopičjem:
<a n:href=":Admin:Product:show">link to Admin:Product:show</a>
Če želimo ugotoviti, ali smo v določenem modulu ali njegovem podmodulu, lahko uporabimo funkcijo
isModuleCurrent(moduleName)
.
<li n:class="isModuleCurrent('MyEshop:Users') ? active">
<a n:href="Product:">...</a>
</li>
Usmerjanje
Glejte poglavje o usmerjanju.
Kartiranje
Mapiranje določa pravila za izpeljavo imena razreda iz imena predstavnika. Ta pravila so določena v konfiguraciji pod ključem application › mapping
.
Strukture imenikov, omenjene prej na tej strani, temeljijo na naslednjem preslikavanju:
application:
mapping: App\UI\*\**Presenter
Kako deluje kartiranje? Za boljše razumevanje si najprej predstavljajmo aplikacijo brez modulov. Želimo, da razredi
predstavnikov spadajo v imenski prostor App\UI
, tako da se predstavnik Home
preslika v razred
App\UI\HomePresenter
. To lahko dosežemo s to konfiguracijo:
application:
mapping: App\UI\*Presenter
Ta preslikava deluje tako, da zvezdico v maski App\UI\*Presenter
nadomestimo z imenom predstavnika
Home
, s čimer dobimo končno ime razreda App\UI\HomePresenter
. Preprosto!
Vendar, kot lahko vidite v primerih v tem in drugih poglavjih, umeščamo predstavitvene razrede v istoimenske podimenike,
npr. predstavitveni razred Home
je preslikan v razred App\UI\Home\HomePresenter
. To dosežemo
s podvojitvijo zvezdice (zahteva program Nette Application 3.2):
application:
mapping: App\UI\**Presenter
Sedaj se lotimo preslikave predstavnikov v module. Za vsak modul lahko opredelimo posebna preslikavanja:
application:
mapping:
Front: App\UI\Front\**Presenter
Admin: App\UI\Admin\**Presenter
Api: App\Api\*Presenter
V skladu s to konfiguracijo se predstavnik Front:Home
prikaže v razred
App\UI\Front\Home\HomePresenter
, predstavnik Api:OAuth
pa v razred
App\Api\OAuthPresenter
.
Ker imata modula Front
in Admin
podoben pristop k preslikavi in ker bo takih modulov verjetno več,
je mogoče ustvariti splošno pravilo, ki ju nadomesti. V masko razreda se doda nova zvezdica za modul:
application:
mapping:
*: App\UI\*\**Presenter
Api: App\Api\*Presenter
Za večnivojske vgnezdene module, kot je predstavnik Admin:User:Edit
, se segment z zvezdico ponovi za vsako
raven, tako da nastane razred App\UI\Admin\User\Edit\EditPresenter
.
Alternativni zapis je, da namesto niza uporabimo polje, sestavljeno iz treh segmentov. Ta zapis je enakovreden prejšnjemu:
application:
mapping:
*: [App\UI, *, **Presenter]
Api: [App\Api, '', *Presenter]
Če imamo v konfiguraciji samo eno pravilo, splošno, lahko zapišemo na kratko:
application:
mapping: App\UI\*\**Presenter