0 follower

Component

Yii-applikationer Àr uppbyggda av komponenter, objekt framtagna efter en specifikation. En komponent Àr en instans av CComponent eller en nedÀrvd klass. AnvÀndning av en komponent involverar huvudsakligen att sÀtta/lÀsa dess propertyn samt signalera/hantera dess event. Basklassen CComponent specificerar hur hur man definierar property och event.

1. Component Property ¶

En komponents property Àr snarlik en publik medlemsvariabel i ett objekt. Vi kan lÀsa dess vÀrde eller tilldela den ett vÀrde. Till exempel,

$width=$component->textWidth;     // get the textWidth property
$component->enableCaching=true;   // set the enableCaching property

För att definiera en property kan vi helt enkelt definiera en publik medlemsvariabel i komponentklassen. Ett mer flexibelt sÀtt Àr att definiera getter- och setter-metoder i komponentklassen pÄ följande sÀtt:

public function getTextWidth()
{
    return $this->_textWidth;
}
 
public function setTextWidth($value)
{
    $this->_textWidth=$value;
}

OvanstÄende kodexempel definierar en skrivbar property textWidth (namnet Àr inte skiftlÀgeskÀnsligt). Vid lÀsning av propertyn kommer getTextWidth() att anropas och dess returvÀrde bildar propertyns vÀrde. Likaledes, vid skrivning till propertyn kommer setTextWidth() att köras. Propertyn kan bara lÀsas om en settermetod inte definierats, försök att skriva leder till en exception. AnvÀndande av getter- och settermetoder för att definiera en property ger den extra fördelen att ytterligare logik (t.ex. för att genomföra validering, signalera event) kan exekveras i samband med lÀsning/skrivning av propertyn.

MÀrk: Det finns en liten skillnad mellan en property definierad genom getter- /settermetoder resp. som en medlemsvariabel i klassen. I det förra fallet Àr namnet skiftlÀgesokÀnsligt (case-insensitive), i det senare skiftlÀgeskÀnsligt.

2. Component Event ¶

KomponenthÀndelser Àr speciella property som tar metoder (s.k. event handlers) som vÀrde. Anslutning (tilldelning) av en metod till en event-property leder till att metoden automatiskt kommer att genomlöpas pÄ de stÀllen dÀr hÀndelsen signaleras. Av denna anledning kan beteendet hos en komponent anpassas pÄ sÀtt som inte var möjliga att förutse vid utvecklingen av komponenten.

En komponents hÀndelse definieras genom att en metod definieras vars namn börjar med on. Precis som propertyn definierade med getter-/settermetoder Àr hÀndelsers namn okÀnsliga för skiftlÀge (case-insensitive). Följande kodexempel definierar en onClicked-hÀndelse:

public function onClicked($event)
{
    $this->raiseEvent('onClicked', $event);
}

dÀr $event Àr en instans av CEvent eller en nedÀrvd klass, representerande parametern event.

Vi kan ansluta en metod till denna hÀndelse som nedan:

$component->onClicked=$callback;

dÀr $callback refererar till en giltig PHP callback i form av en global funktion eller en klassmetod. I det senare fallet mÄste denna callback ges i form av en array: array($object,'methodName').

Signaturen för en hÀndelsehanterare (event handler) mÄste se ut sÄ hÀr:

function methodName($event)
{
    ......
}

dÀr $event Àr parametern som beskriver hÀndelsen (med ursprung i raiseEvent()-anropet). $event-parametern Àr en instans av CEvent eller nedÀrvd klass. Som ett minimum innehÄller den information om vem som signalerat hÀndelsen.

En hÀndelsehanterare kan Àven ha formen av en anonym funktion, vilket stöds av PHP 5.3 eller senare. Till exempel,

$component->onClicked=function($event) {
    ......
}

Om vi nu anropar onClicked() kommer onClicked-hÀndelsen att signaleras (inuti onClicked()), vilket leder till att den anslutna hÀndelsehanteraren anropas automatiskt.

En hÀndelse kan bli ansluten till flera hÀndelsehanterare. DÄ hÀndelsen signaleras kommer hanterarna att anropas i den ordning de anslutits till hÀndelsen. En hanterare kan förhindra att de följande hanterarna körs genom att sÀtta $event->handled till true.

3. Komponents "Behavior" ¶

Komponenter stöder designmönstret mixin och kan sammankopplas med en eller flera behavior. En behavior Àr ett objekt vars metoder kan Àrvas 'inherited' av dess sammankopplade komponent genom att aggregera funktionalitet i stÀllet för specialisering (dvs normalt klassarv). En komponent kan sammankopplas med flera behavior och pÄ sÄ sÀtt Ästadkomma 'multipelt arv'.

Behavior-klasser mÄste implementera grÀnssnittet IBehavior. De flesta behavior kan utvidga basklassen CBehavior. Om en behavior behöver sammankoplas med en modell kan den Àven utgÄ frÄn dvs utvidga CModelBehavior eller CActiveRecordBehavior, vilka implementerar tillkommande finesser specifika för modeller.

För att anvÀnda en behavior, mÄste den först - genom anrop till dess attach()-metod - sammankopplas med en komponent. DÀrefter kan vi anropa en behavior-metod via komponenten.

// $name uniquely identifies the behavior in the component
$component->attachBehavior($name,$behavior);
// test() is a method of $behavior
$component->test();

En sammankopplad behavior kan adresseras precis som en normal property i komponenten. Till exempel, om en behavior med namnet tree Àr sammankopplad med en komponent, kan en referens till denna behavior erhÄllas pÄ följande sÀtt:

$behavior=$component->tree;
// equivalent to the following:
// $behavior=$component->asa('tree');

En behavior kan tillfÀlligt stÀngas av sÄ att dess metoder ej Àr tillgÀngliga via komponenten. Till exempel,

$component->disableBehavior($name);
// the following statement will throw an exception
$component->test();
$component->enableBehavior($name);
// it works now
$component->test();

Det Àr möjligt att tvÄ behavior sammankopplade med en och samma komponent har metoder med likadant namn. I sÄ fall kommer metoden i den först sammankopplade behavior att ges prioritet.

NÀr de anvÀnds tillsammans med hÀndelser Àr behavior Ànnu mer kraftfulla. En behavior kan, nÀr den Àr sammankopplad med en komponent, koppla nÄgon/nÄgra av sina metoder till komponentens hÀndelser (events). En behavior kan, genom att göra detta, ges en chans att observera eller Àndra komponentens normala exekveringsflöde.

En behavior:s propertyn kan Àven nÄs via komponenten den Àr knuten till. Dessa propertyn omfattar sÄvÀl publika medlemsvariabler som propertyn definierade via get- och/eller set-metoder i denna behavior. Till exempel, om en behavior har en property xyz och behaviorn kopplas till komponenten $a kan uttrycket $a->xyz anvÀndas för tillgÄng till behaviorns property.

Found a typo, or you think this page needs improvement?
Edit it on GitHub !