Maison >développement back-end >tutoriel php >Analyse des composants du framework Yii et gestion du comportement des événements

Analyse des composants du framework Yii et gestion du comportement des événements

不言
不言original
2018-06-19 14:19:342428parcourir

Cet article présente principalement les composants du framework Yii et la gestion du comportement des événements, et fournit une analyse détaillée des principes et des techniques d'utilisation de la gestion des composants du framework Yii et de la gestion du comportement. Les amis dans le besoin peuvent s'y référer

Cet article. décrit les exemples de composants Yii Framework et de gestion du comportement des événements. Partagez-le avec tout le monde pour votre référence, les détails sont les suivants :

Yii est un framework PHP hautes performances basé sur des composants pour développer des applications Web à grande échelle. CComponent est presque la classe de base de toutes les classes. Elle contrôle la gestion des composants et des événements. Ses méthodes et propriétés sont les suivantes. La variable privée $_e stocke les événements (evnet, appelé hook à certains endroits). stocke le comportement (comportement).

Gestion des composants

YII est un pur framework oop, les variables membres dans de nombreuses classes sont protégées ou privées, CComponent Les méthodes magiques. __get() et __set() en PHP sont utilisés pour accéder et définir des attributs, mais les fonctions de ces méthodes vont bien au-delà. Ce qui suit utilise __get() pour illustrer

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)));
}

Lorsque CComponent ou son instance d'objet de sous-classe $obj->name, la méthode __get($name ) :

1. Déterminez d'abord s'il existe une méthode getName() dans l'instance. Si c'est le cas, retournez Ceux qui commencent par on sont généralement des événements réservés dans les sous-classes de CComponent. $this,$name) pour déterminer si le nom existe dans une instance de la classe. S'il existe, retournez l'événement, sinon exécutez l'étape 3. Étape

Si le nom existe dans le tableau de comportement, retournez. le comportement modifié. S'il n'existe pas, effectuez l'étape 4.

4. Parcourez le tableau de comportements. Le comportement dans le tableau est une instance de la sous-classe CBehavior et CBehavior est une sous-classe de CComponent. une méthode récursive pour récupérer la méthode dans le comportement. Sinon, effectuez l'étape 5

5. Lancez une exception : l'attribut demandé n'existe pas.

La méthode __get() peut être surchargée dans la sous-classe CComponent, par exemple, le jugement d'obtention du composant est ajouté à CModule. Cela pose un problème. Il est préférable de ne pas avoir le même nom pour les attributs et les composants, car le programme chargera le composant en premier et risque de ne pas obtenir les attributs souhaités. Si les noms doivent être identiques, des getters doivent être utilisés. obtenir les attributs.

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

Concernant le chargement et la création des composants, la dernière analyse du framework YII note 1 : Il y a une question dans le troisième point du processus d'exécution de YII : enregistrement Lorsque les composants principaux du framework sont chargés en si grand nombre à la fois, cela affecte-t-il les performances ? En fait non. Lors de l'inscription, vous enregistrez simplement le composant et sa configuration correspondante sous forme de paires clé-valeur dans un tableau (sauf pour ceux préchargés, vous pouvez créer le composant comme ci-dessus, ce qui sera fait). via createComponent (dans YIIBase), la méthode est créée et initialisée. Lors de l'appel de __get() ou getComponent() pour obtenir un composant via CModule ou sa classe descendante (telle que CWebApplication), CModule établit un pool d'objets via le tableau $_components pour garantir que chaque composant n'est instancié qu'une seule fois dans une requête.

Gestion du comportement des événements

Les événements sont équivalents à des extensions ou plug-ins à un composant. Les hooks réservés dans le composant sont utilisés pour implémenter des appels internes vers l'extérieur de celui-ci. le composant et contrôle partiel du composant depuis l'extérieur. Dans la sous-classe CComponent, vous pouvez définir des méthodes commençant par on comme événements, similaires à onclick, onchange, etc. dans js. En fait, les principes sont similaires. Tous les événements sont des sous-classes de CEvent dans le même fichier que 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));
}

Par exemple, lors de l'appel de la méthode run() dans CApplication, avant de traiter la requête, déterminez d'abord si le handle de l'événement onBeginRequest est transmis en externe, et si c'est le cas, transmettez la méthode onBeginRequest( $event) qui appelle la méthode raiseEvent() dans CComponent pour exécuter la fonction ou la méthode dans le handle.

Behavior est une version améliorée de l'événement, et tous les comportements sont des sous-classes de CBehavior. En analysant l'étape 4 de l'analyse de la méthode __get() ci-dessus, nous pouvons voir que le rôle du comportement est d'étendre complètement les caractéristiques du composant, qui peuvent être des propriétés, des méthodes, des événements et même des comportements, ce qui rend le développement du programme plus flexible.

Une autre fonction du comportement est de rassembler des descripteurs d'événements similaires. Lorsque le comportement exécute la méthode attach(), il liera le descripteur d'événement renvoyé dans la méthode events(). Cela permet d'atteindre l'objectif de gestion et d'expansion des aspects. . Par exemple, CModelBehavior collecte des événements liés au modèle pour faciliter la réutilisation de ses sous-classes. Nous pouvons en hériter lorsque nous devons ajouter des comportements au modèle.

Ce qui précède représente l'intégralité du contenu de cet article. J'espère qu'il sera utile à l'étude de chacun. Pour plus de contenu connexe, veuillez faire attention au site Web PHP chinois !

Recommandations associées :

À propos de l'utilisation du composant de pagination yii


À propos de l'utilisation du validateur de classe de règles dans les données Yii modèle


Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn