Nette: moduly

Moduly#

U složitějších aplikací můžeme složky s presentery a šablonami rozčlenit do podadresářů, kterým říkáme moduly. Pokud by naše aplikace obsahovala například moduly Front a Admin, její struktura by mohla vypadat takto:

sandbox/     
app/ ← adresář s aplikací
AdminModule/ ← modul Admin
presenters/ ← a jeho presentery
templates/ ← a šablony
FrontModule/ ← modul Front
presenters/ ← a jeho presentery
templates/ ← a šablony

...

Moduly nemusí tvořit jen plochou strukturu, lze vytvářet i submoduly atd.

Pokud by součástí modulu Front byl presenter Product. Akce show se pak zapíše jako Front:Product:show a třída ProductPresenter se umístí do jmenného prostoru FrontModule:

namespace FrontModule;

class ProductPresenter extends \Nette\Application\UI\Presenter
{
    // ...
}

Config

Dále nesmíme opomenout na application mapping v config souboru. Defaultně máme nastaveno následovně.

application:
	errorPresenter: Error
	mapping:
		*: App\*Module\Presenters\*Presenter

Config ale změníme takto:

application:
	errorPresenter: Error
	mapping:
		*: *Module\*Presenter

RouterFactory

Poslední věcí je routování. Abychom byli schopni nasměrovat uživatele na dané moduly (a jejich presentery), potřebujeme několik úprav v našich routách. Následující kód ukazuje, jak by naše routy mohly vypadat.

use Nette,
Nette\Application\Routers\RouteList,
Nette\Application\Routers\Route;
/**
* Router factory.
*/
class RouterFactory
{
/**
* @return \Nette\Application\IRouter
*/
public function createRouter()
{
$router = new RouteList();
 
$admin = new RouteList('Admin');
$admin[] = new Route('admin/<presenter>/<action>[/<id>]', 'Homepage:default');
$router[] = $admin;
 
$member = new RouteList('Customer');
$member[] = new Route('customer/<presenter>/<action>[/<id>]', 'Homepage:default');
$router[] = $member;
 
$public = new RouteList('Public');
$public[] = new Route('<presenter>/<action>[/<id>]', 'Public:Homepage:default');
$router[] = $public;
 
$router[] = new Route('<presenter>/<action>[/<id>]', 'Public:Homepage:default');
 
return $router;
}
}

error page

application:
    errorPresenter: Error
    mapping:
        *: App\Modules\*\Presenters\*Presenter
        Error: App\Presenters\*Presenter

anebo

$container->getService('application')->errorPresenter = 'Public:Error';