Práce s moduly
V této kapitole se podíváme jak s moduly pracovat a to od jejich vytvoření, přes jejich správu (instalaci, aktivaci) až po jejich použití v aplikaci - například jiným modulem.
Vytvoření modulu
Tak určitě :-) Moduly můžete vytváře zcela ručně. Ale po pravdě.... Mě to fakt nebavilo. Proto má Jet Studio tvůrce modulů. To je funkce, která podle šablony modul vytvoří. Šablony lze také vytvářet, ale to je již téma mimo tuto dokumentaci. Aktuálně jsou k dispozici dvě šablony. První vytvoří zcela základní strukturu modulu, ta druhá umí vytvořit celý administrační modul pro správu nějaké datové entity. Nejlepší je si to prostě vyzkoušet.
Instalace / deinstalace, aktivace / deaktivace
Pokud chcete instalovat a aktivovat moduly, tak máte k dispozici dva nástroje. Prvním a doporučeným je ("překvapivě") Jet Studio
A pozor! Jet Studio umí mnohem více než pouze moduly aktivovat a instalovat. To zdaleka není jediná funkce. Modulům můžete "naklikat" prakticky vše. Včetně definic stránek a položek menu.
Druhá možnost je použít CLI nástroje v adresáři ~/_tools/cli/.
Ale pochopitelně to lze udělat i ze skriptu a můžete si vytvořit svoje vlastní nástroje. Je to vlastně jednoduché:
Instalace modulu:
Application_Modules::installModule( $module_name );
Deinstalace modulu:
Application_Modules::uninstallModule( $module_name );
Aktivace modulu:
Application_Modules::activateModule( $module_name );
Deaktivace modulu:
Application_Modules::deactivateModule( $module_name );
Použití modulu
Nejtypičtější použití modulů je v rámci MVC. Ale jak jsme si již řekli, tak jeden modul může být použit dalším modulem. Jak na to? Je dobré dodržovat několik zásad a držet se principů:
Aplikační kód který bude používat jiný modul by měl počítat s tím, že používaný modul může být deaktivován. Proto má Jet metodu jak zjistit zda je modul k dispozici.
Dalším pravidlem je, že aplikační kód používající jiný modul by neměl vytvářet instance tříd používaného modulu přímo. Technicky to sice lze, ale porušuje se tím princip, kdy je modul zapouzdřená mikroaplikace, která by měla být použita ostatními moduly přes svoji třídu Main. K instanci modulu (přesněji k instanci třídy Main modulu) je tedy vhodné přistupovat přes příslušné metody Jet a funkce modulu používat prostřednictvím této instance. Ideální je, když je v obecných třídách aplikace definováno rozhraní, které třída Main využívaného modulu implementuje.
Ale ukažme si vše raději rovnou prakticky. Máme následující situaci: modul A (nazvěme jej Module.A), který má v aplikaci specifické poslání a jehož třída Main implementuje rozhraní JetApplication\Modules_Some_Interface a toto rozhraní deklaruje metodu someMethod() : string. Zde je kód hlavní třídy Module.A:
namespace JetApplicationModule\Module\A;
use Jet\Application_Module;
class Main extends Application_Module implements Modules_Some_Interface {
public function someMethod() : string
{
return "Hello world!";
}
}
A pak v jiné části aplikace, třeba v jiném modulu, můžeme tuto metodu zavolat. Jak to udělat? Takto:
use Jet\Application_Modules;
if(Application_Modules::moduleIsActivated('Module.A')) {
/**
* @var Modules_Some_Interface $module
*/
$module = Application_Modules::moduleInstance('Module.A');
$something = $module->someMethod();
} else {
$something = null;
}
Připomeňme si, že kód by měl zjistit, zda je požadovaný modul vůbec aktivní a podle toho se zachovat. A rovněž s dovolením ještě jednou zdůrazním vhodnost k instanci hlavní třídy modulu přistupovat přes příslušnou metodu, tedy přes Jet\Application_Modules::moduleInstance( $module_name ).
Jak vidno, tak k práci s moduly se používá třída Jet\Application_Modules a to je další věc hodná k prozkoumání.