En modul är en komplett och oberoende mjukvaruenhet som består av modeller, vyer, kontrollrar samt andra stödkomponenter. En modul motsvarar ur många aspekter en applikation. Den huvudsakliga skillnaden är att en modul inte kan sättas ut på egen hand, den måste härbärgeras i en applikation. Användare kan komma åt en kontroller i en modul så som de gör med en vanlig kontroller på applikationsnivå.
Moduler är användbara i ett flertal scenarier. En storskalig applikation kan delas upp i flera moduler, som var och en utvecklas och underhålls separat. Vissa vanligen använda finesser, som administrering av användare eller kommentarhantering, kan utvecklas i form av moduler vilka utan svårighet kan återanvändas i kommande projekt.
En modul organiseras i en katalog vars namn bildar dess unika ID. Modulkatalogens struktur
liknar strukturen hos applikationens rotkatalog.
Nedan visas den typiska katalogstrukturen för en modul benämnd forum
:
forum/ ForumModule.php modulens klassfil components/ innehåller återanvändbara komponenter views/ innehåller vyfiler för widget controllers/ innehåller kontrollerklassfiler DefaultController.php standardkontrollerns klassfil extensions/ innehåller tredjepartstillägg models/ innehåller modellklassfiler views/ innehåller kontrollervyfiler och layoutfiler layouts/ innehåller layoutvyfiler default/ innehåller vyfiler för DefaultController index.php fil som innehåller indexvy
En modul måste ha en modulklass som ärver från och utvidgar CWebModule. Klassnamnet bildas med hjälp av
uttrycket ucfirst($id).'Module'
, där $id
refererar till modulens ID (läs: modulens katalognamn).
Modulklassen utgör den centrala platsen för lagring av information som skall delas av modulens kod.
Vi kan till exempel använda CWebModule::params för lagring av modulparametrar, samt använda
CWebModule::components för att dela applikationskomponenter
på modulnivå.
Tips: Modulgenereringen i Gii kan användas för att skapa det grundläggande skelettet till en ny modul.
För att använda en modul, placera först modulkatalogen under katalogen modules
i
applikationens rotkatalog.
Deklarera sedan modulens ID i applikationens property modules.
För att till exempel använda ovanstående forum
-modul, kan följande
applikationskonfiguration
användas:
return array(
......
'modules'=>array('forum',...),
......
);
En modul kan även konfigureras med initiala propertyvärden. Tillvägagångssättet är mycket snarlikt
konfigurering av applikationskomponenter.
Exempel: forum
-modulen kan i sin modulklass ha en property postPerPage
, vilken kan konfigureras i
applikationskonfigurationen på följande sätt:
return array(
......
'modules'=>array(
'forum'=>array(
'postPerPage'=>20,
),
),
......
);
Modulinstansen kan kommas åt via propertyn module i den för tillfället aktiva kontrollern.
Genom modulinstansen kan vi sedan nå information som delas på modulnivå. Exempelvis kan följande uttryck användas
för att komma åt ovanstående postPerPage
-information:
$postPerPage=Yii::app()->controller->module->postPerPage;
// or the following if $this refers to the controller instance
// $postPerPage=$this->module->postPerPage;
En kontrolleråtgärd i en modul kan nås via en route på formatet
moduleID/controllerID/actionID
. Exempel: om vi antar att ovanstående forum
-modul har en
kontroller PostController
, kan vi som route använda
forum/post/create
för att referera till åtgärden create
i denna kontroller. Motsvarande
URL för denna route blir då http://www.example.com/index.php?r=forum/post/create
.
Tips: Om en kontroller finns i en underkatalog till
controllers
, kan vi fortfarande använda ovanstående route format. Till exempel omPostController
är placerad underforum/controllers/admin
kan vi referera till åtgärdencreate
genom att användaforum/admin/post/create
.
Moduler kan vara nästlade i ett obegränsat antal nivåer. Det vill säga, en modul kan innehålla en annan modul som i sin tur kan innehålla ännu en modul. Vi kallar den förra föräldramodul (parent module), den senare barnmodul (child module). En barnmodul måste deklareras i dess föräldramoduls property modules, vilket motsvarar deklaration av moduler i applikationskonfigurationen, åskådliggjort ovan.
För att komma åt en kontrolleråtgärd i en barnmodul, använder vi följande route
parentModuleID/childModuleID/controllerID/actionID
.
Found a typo or you think this page needs improvement?
Edit it on github !
Signup or Login in order to comment.