Heim  >  Artikel  >  Backend-Entwicklung  >  Analyse von Yii-Framework-Komponenten und Ereignisverhaltensmanagement

Analyse von Yii-Framework-Komponenten und Ereignisverhaltensmanagement

不言
不言Original
2018-06-19 14:19:342396Durchsuche

Dieser Artikel stellt hauptsächlich die Yii-Framework-Komponenten und das Ereignisverhaltensmanagement vor und bietet eine detaillierte Analyse der Prinzipien und Nutzungstechniken des Yii-Framework-Komponentenmanagements und des Verhaltensmanagements. Freunde in Not können darauf verweisen

Dieser Artikel Beschreibt die Beispiele der Yii Framework-Komponenten- und Ereignisverhaltensverwaltung. Teilen Sie es als Referenz mit allen. Die Details lauten wie folgt:

Yii ist ein komponentenbasiertes Hochleistungs-PHP-Framework für die Entwicklung umfangreicher Webanwendungen. CComponent ist fast die Basisklasse aller Klassen. Ihre Methoden und Eigenschaften sind wie folgt: Die private Variable $_e speichert Ereignisse (manchmal auch Hook genannt) und das Array $_m speichert Verhaltensweisen (Verhalten).

Komponentenverwaltung

YII ist ein reines Oop-Framework in vielen Klassen, CComponent Die magischen Methoden __get() und __set() werden in PHP verwendet, um auf Eigenschaften zuzugreifen und diese festzulegen, aber die Funktionen dieser Methoden gehen weit darüber hinaus. Im Folgenden wird __get() verwendet, um

public function __get($name)
{
  $getter='get'.$name;
  if(method_exists($this,$getter))
    return $this->$getter();
  else if(strncasecmp($name,'on',2)===0 && method_exists($this,$name))
  {
    // duplicating getEventHandlers() here for performance
    $name=strtolower($name);
    if(!isset($this->_e[$name]))
      $this->_e[$name]=new CList;
    return $this->_e[$name];
  }
  else if(isset($this->_m[$name]))
    return $this->_m[$name];
  else if(is_array($this->_m))
  {
    foreach($this->_m as $object)
    {
      if($object->getEnabled() && (property_exists($object,$name) || $object->canGetProperty($name)))
        return $object->$name;
    }
  }
  throw new CException(Yii::t('yii','Property "{class}.{property}" is not defined.',
    array('{class}'=>get_class($this), '{property}'=>$name)));
}

Wenn CComponent oder seine Unterklassenobjektinstanz $obj->name verwendet wird, die __get($name)-Methode :

1. Bestimmen Sie zunächst, ob es eine getName()-Methode in der Instanz gibt. Wenn ja, handelt es sich um Ereignisse, die in CComponent-Unterklassen reserviert sind. Sie werden verwendet, um an Ereignissen festzuhalten Name), um festzustellen, ob der Name in einer Instanz der Klasse vorhanden ist. Andernfalls führen Sie Schritt 3 aus.

3 Wenn der Name im Verhaltensarray vorhanden ist, geben Sie das geänderte Verhalten zurück Wenn es nicht existiert, führen Sie Schritt 4 aus.

4. Durchlaufen Sie das Verhaltensarray. Das Verhalten im Array ist eine Instanz der CBehavior-Unterklasse, und CBehavior ist wieder eine Unterklasse von CComponent. Verwenden Sie daher eine rekursive Methode Um die Methode im Verhalten zu erhalten, führen Sie Schritt 5 aus.

5. Eine Ausnahme auslösen: Das angeforderte Attribut existiert nicht.

Die __get()-Methode kann in der CComponent-Unterklasse überladen werden. Beispielsweise wird die Entscheidung über den Erhalt der Komponente zu CModule hinzugefügt. Dies führt zu einem Problem. Es ist am besten, nicht denselben Namen für Attribute und Komponenten zu verwenden, da das Programm die Komponente zuerst lädt und die gewünschten Attribute möglicherweise nicht abgerufen werden. Wenn die Namen identisch sein müssen, müssen Getter identisch sein wird verwendet, um die Attribute zu erhalten.

public function __get($name)
{
  if($this->hasComponent($name))
    return $this->getComponent($name);
  else
    return parent::__get($name);
}

In Bezug auf das Laden und Erstellen von Komponenten wurden in der vorherigen YII-Framework-Analyse Anmerkungen 1: Im dritten Punkt des YII-Ausführungsprozesses gibt es eine Frage: Registrierung Der Kern des Frameworks Beeinträchtigt das gleichzeitige Laden so vieler Komponenten die Leistung? Eigentlich nein. Bei der Registrierung speichern Sie einfach die Komponente und ihre entsprechende Konfiguration in Form von Schlüssel-Wert-Paaren in einem Array (außer bei vorinstallierten). Bei Verwendung können Sie die Komponente wie oben über createComponent( in) erstellen Die YIIBase-Methode wird erstellt und initialisiert. Beim Aufrufen von __get() oder getComponent() über CModule oder seine Nachkommen (z. B. CWebApplication) zum Abrufen von Komponenten erstellt CModule einen Objektpool über das Array $_components, um sicherzustellen, dass jede Komponente nur einmal in einer Anforderung instanziiert wird.

Ereignisverhaltensverwaltung

Ereignisse entsprechen Erweiterungen oder Plug-Ins einer Komponente. Die in der Komponente reservierten Hooks werden verwendet, um interne Aufrufe nach außen zu implementieren die Komponente und teilweise Kontrolle der Komponente von außen. In der CComponent-Unterklasse können Sie Methoden, die mit on beginnen, als Ereignisse definieren, ähnlich wie onclick, onchange usw. in js. Tatsächlich sind die Prinzipien ähnlich. Alle Ereignisse sind Unterklassen von CEvent in derselben Datei wie CComponent.

/**
* Raised right BEFORE the application processes the request.
* @param CEvent $event the event parameter
*/
public function onBeginRequest($event)
{
  $this->raiseEvent('onBeginRequest',$event);
}
/**
* Runs the application.
* This method loads static application components. Derived classes usually overrides this
* method to do more application-specific tasks.
* Remember to call the parent implementation so that static application components are loaded.
*/
public function run()
{
  if($this->hasEventHandler('onBeginRequest'))
    $this->onBeginRequest(new CEvent($this));
  $this->processRequest();
  if($this->hasEventHandler('onEndRequest'))
    $this->onEndRequest(new CEvent($this));
}

Wenn Sie beispielsweise die run()-Methode in CApplication aufrufen, ermitteln Sie vor der Verarbeitung der Anforderung zunächst, ob das Handle des onBeginRequest-Ereignisses extern übergeben wird. Wenn dies der Fall ist, ruft die Methode onBeginRequest($event) die Methode raiseEvent() in CComponent auf, um die Funktion oder Methode im Handle auszuführen.

Behavior ist eine aktualisierte Version von Event, und alle Verhaltensweisen sind Unterklassen von CBehavior. Wenn wir Schritt 4 der obigen __get()-Methodenanalyse analysieren, können wir sehen, dass die Rolle des Verhaltens darin besteht, die Eigenschaften der Komponente vollständig zu erweitern, bei denen es sich um Eigenschaften, Methoden, Ereignisse und sogar Verhaltensweisen handeln kann, was die Programmentwicklung flexibler macht.

Eine weitere Funktion des Verhaltens besteht darin, ähnliche Ereignishandles zusammenzufügen. Wenn das Verhalten die Methode attachment() ausführt, wird es den Zweck der Aspektverwaltung und -erweiterung binden . CModelBehavior sammelt beispielsweise modellbezogene Ereignisse, um die Wiederverwendung seiner Unterklassen zu erleichtern. Wir können es erben, wenn wir dem Modell Verhaltensweisen hinzufügen müssen.

Das Obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, er wird für das Studium aller hilfreich sein. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website.

Verwandte Empfehlungen:

Über die Verwendung der Yii-Paging-Komponente


Über die Verwendung des Regelklassenvalidators in Yii-Daten Modell


Das obige ist der detaillierte Inhalt vonAnalyse von Yii-Framework-Komponenten und Ereignisverhaltensmanagement. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn