Maison  >  Article  >  développement back-end  >  Une brève analyse du mécanisme de composantisation du framework Yii

Une brève analyse du mécanisme de composantisation du framework Yii

*文
*文original
2018-01-05 17:21:201721parcourir

Cet article présente principalement les connaissances de base du mécanisme de composantisation du framework Yii de PHP, et analyse brièvement le composant CWebApplication de l'application. Les amis dans le besoin peuvent s'y référer.

Les composants sont les principaux éléments constitutifs des applications Yii. Est une instance de la classe yiibaseComponent ou de ses sous-classes. Les trois fonctions principales utilisées pour le distinguer des autres classes sont :

  • Propriété

  • Événement

  • Comportement

Soit utilisées seules, soit en conjonction les unes avec les autres, l'application de ces fonctions rend les classes Yii plus flexibles et plus faciles à utiliser. Prenons l'exemple du widget yiijuiDatePicker. Il s'agit d'un composant d'interface utilisateur qui vous permet de générer facilement un sélecteur de date interactif dans la vue :

use yii\jui\DatePicker;

echo DatePicker::widget([
  'language' => 'zh-CN',
  'name' => 'country',
  'clientOptions' => [
    'dateFormat' => 'yy-mm-dd',
  ],
]);

Ce widget hérite de yiibaseComponent, et ses différentes propriétés seront très difficiles à gérer. réécrire facile.

Précisément en raison des fonctions puissantes des composants, ils sont légèrement plus lourds que les objets ordinaires (Object) car ils utilisent de la mémoire et du temps CPU supplémentaires pour traiter les événements et les comportements. Si vous n'avez pas besoin de ces deux fonctionnalités, vous pouvez hériter de yiibaseObject au lieu de yiibaseComponent. De cette façon, le composant peut être aussi efficace qu'un objet PHP normal, tout en prenant également en charge la fonction de propriété.

Lors de l'héritage de yiibaseComponent ou yiibaseObject, il est recommandé d'utiliser le style de codage suivant :

Si vous devez remplacer le constructeur (Constructor), transmettez $config comme dernier paramètre du méthode constructeur. Ensuite, transmettez-la au constructeur de la classe parent.
Appelez toujours le constructeur de la classe parent à la fin de votre constructeur remplacé.
Si vous remplacez la méthode yiibaseObject::init(), assurez-vous d'appeler la méthode init de la classe parent au début de la méthode init.
Un exemple est le suivant :

namespace yii\components\MyClass;

use yii\base\Object;

class MyClass extends Object
{
  public $prop1;
  public $prop2;

  public function __construct($param1, $param2, $config = [])
  {
    // ... 配置生效前的初始化过程

    parent::__construct($config);
  }

  public function init()
  {
    parent::init();

    // ... 配置生效后的初始化过程
  }
}

De plus, afin que le composant soit correctement configuré lors de la création d'une instance, veuillez suivre le processus de fonctionnement suivant :

$component = new MyClass(1, 2, ['prop1' => 3, 'prop2' => 4]);
// 方法二:
$component = \Yii::createObject([
  'class' => MyClass::className(),
  'prop1' => 3,
  'prop2' => 4,
], [1, 2]);

Supplémentaire : même si vous appelez Yii La méthode ::createObject() semble plus compliquée, mais c'est principalement parce qu'elle est plus flexible et plus puissante, et qu'elle est implémentée sur la base du conteneur d'injection de dépendances.
Le cycle de vie de la classe yiibaseObject lors de l'exécution est le suivant :

Processus de pré-initialisation au sein du constructeur. Vous pouvez définir ici des valeurs par défaut pour chaque propriété.
Configurez les objets via $config. Le processus de configuration peut écraser les valeurs par défaut précédemment définies dans le constructeur.
Effectuez le travail de finition après l'initialisation dans la méthode yiibaseObject::init(). Vous pouvez remplacer cette méthode pour effectuer certaines tâches telles que le contrôle qualité et l'initialisation des attributs.
Appel de méthode objet.
Les trois premières étapes se déroulent toutes au sein du constructeur de l'objet. Cela signifie qu'une fois que vous obtenez une instance d'objet, elle est initialisée et prête à être utilisée.

Composant Application CWebApplication
Avant d'expliquer comment utiliser chaque composant dans Yii, comprenons d'abord le composant le plus important, CWebApplication. CWebApplication est l'objet application, et sa classe racine est également CComponent, c'est donc également un composant et possède les caractéristiques communes des composants Yii.
Plus précisément, la fonction principale du composant CWebApplication est de charger les composants auxiliaires nécessaires en fonction du fichier de configuration, et de créer et d'exécuter le contrôleur à l'aide de ces composants (tels que urlManager). C’est pourquoi on l’appelle également contrôleur frontal.
Nous pouvons spécifier les paramètres de configuration du composant CWebApplication lui-même dans le fichier de configuration. Ces paramètres sont définis sur ses variables membres publiques, ou la méthode setter est automatiquement appelée pour définir les propriétés. Cette fonctionnalité peut être trouvée dans le constructeur de CWebApplication. : $this- >configure($config);
Comme spécifié dans le fichier de configuration protected/config/main.php globalement :

'charset' => 'utf-8',

Cela définit en fait la propriété publique charset de l'application actuelle (dans la déclaration CApplication) et si 'langue' => 'zh_cn' est spécifié dans le fichier de configuration, on constate que CWebApplication et toutes ses classes supérieures ne déclarent pas l'attribut $langue. Dans ce cas, la méthode du mode setter, setlanuage, sera utilisé (cette méthode est définie dans le milieu de la classe CApplication).
OK, après avoir compris cette fonctionnalité, nous pouvons comprendre les attributs qui peuvent être configurés dans le fichier de configuration :

  • Variables membres publiques de CWebApplication et toutes ses classes supérieures

  • Attributs spécifiés par les méthodes setter de CWebApplication et toutes ses classes supérieures Bien sûr, nous pouvons également construire notre propre classe d'application en héritant de CWebApplication.

La hiérarchie d'héritage de CWebApplication est la suivante : CApplication -> CModule -> Nous expliquerons les éléments de configuration courants dans le fichier de configuration par défaut et leurs emplacements effectifs :

  • basePath : CApplication::setBasePath()

  • nom : CApplication::$name

  • préchargement : CModule ::$preload

  • importation : CModule::setImport()

  • defaultController : CWebApplication::$defaultController

  • composants : CModule::setComponents()

De même, répertoriez plusieurs éléments de configuration qui ne sont pas répertoriés dans le fichier de configuration par défaut : timezone: CApplication:: setTimeZone() # Configurer le fuseau horaire

再例如,如果我们继承CWebApplication, 扩展自己的应用程序类myApp, 并定义方法setError_reporting(不区分大小写), 那么就可以直接在配置文件中指定error_reporting选项。
辅助组件可以将CWebApplication组件视为一部机器,那么辅助组件就可以视为组成这部机器的各个零件,没有零件的正确组合,机器就无法正常工作,这在Yii中也是同样的概念。而一些组件对整部机器的运转是必须的,这就是核心组件。在应用程序对象构造后,Yii会将辅助组件基本信息进行登记(组件名称与类名,属性配置的对照表),以供后续使用,对web应用程序而言,存在以下核心组件(通过CWebApplication::registerCoreComponents,CApplication::registerCoreComponents注册):

CWebApplication::registerCoreComponents中注册的核心组件

2016317152903914.png (629×145)

CApplication::registerCoreComponents中注册的核心组件

2016317152921101.png (645×160)

配置文本中注册的核心组件:log CLogRouter 日志路由管理器
以上标记为红色的条目,是最重要的辅助组件,其它的核心组件我们未必会使用到。
如何定义辅助组件的属性?通过在配置文件protected/config/main.php中设置components项的值,实现组件属性定义。这里的定义主要是三个要素:指定组件的名称(核心组件已经预先设置)、指定组件使用的类(核心组件无须定义),组件的属性(可选、视情况而定)
如以下配置:

'components' => array(
'db' => array(
'class' => 'myCDbConnection',
'connnectionString' => 'mysql:host=localhost;dbname=test;charset=utf8',
'user' => 'root',
),
);

就设置了db组件使用的类为myCDbConnection, 并且在后面指定了连接串及账号等信息。提示: myCDbConnection类可能就是通过继承CDbConnection类定义。核心组件无须指定class参数(因为已经预先定义好)
问题:如何得知某个组件可配置的属性?这个问题至关重要,如果我们掌握了规律,就可以举一反三,所有组件的配置均可以灵活设定。授之以鱼不如授之以渔。在本节会说明通用的方法。要得知组件的所有可定义属性,按以下步骤进行:
1. 组件所使用的类是什么?(无论是核心组件还是自定义组件)
2. 组件类的公共成员变量都有哪些?(注意从父类继承而来的公共成员变量)
3. 组件类都有哪些settter方法?(注意从父类继承而来的方法)
明白了以上三个要点,我们就可以按规律定义组件的属性,比如对最重要的db组件,我们发现这是一个核心组件,使用的类为CDbConnection, 我们查阅这个类的定义文件,发现这个类的公共成员变量有:

$connectionString;

  • $username='';

  • $password='';

  • $autoConnect=true;

  • $charset;

  • $emulatePrepare;

  • $tablePrefix;

  • $initSQLs;

  • ... ...

setter方法定义的属性:

  • setActive($value)

  • setAttributes($values)

  • setAutoCommit($value)

  • setColumnCase($value)

  • setNullConversion($value)

  • setPersistent($value)

提示:setter方法定义的属性名称不区分大小写以上所列的属性,均可以在配置文件中指定,具体每个属性的作用,请参阅Yii类文件的详细注释(Yii代码的注释也是相当棒,通俗易懂,而又很详细)

再来一个例子,定义urlManager组件的属性这个组件使用的类为CUrlManager, 我们查阅它的属性:

  • $rules=array();

  • $urlSuffix='';

  • $showScriptName=true;

  • $appendParams=true;

  • $routeVar='r';

  • $caseSensitive=true;

通过setter方法定义的属性:

  • setUrlFormat($value)

  • setBaseUrl($value)

即urlManager组件的上述属性可以在配置文件中定义(每项配置的作用请参阅其注释)。其它组件的配置均可按上述方法处理。

如何使用组件应用程序运行后,会将所有已经定义过的组件注册(并未实例化)到CWebApplication对象上,同时CWebApplication应用程序对象会被注册到Yii::$_app,在程序的任何位置均可通过Yii::app()得到当前应用程序对象引用,再通过$app对象得到组件实例引用,如:Yii::app()->getComponent('urlManager');  #会查找组件配置并实例化之Yii::app()->urlManager;  #通过CModule::__get()魔术方法实现
如何自定义组件?这是很常见的需求,比如我们可能希望db组件(数据库连接)使用我们自定义的类,也或者我们希望使用多个数据库连接,这种情况下就需要自定义组件,使用多数据库的例子:

components=>array(
'db' => array(
... ...
),
'mydb'=>array(
'class' => 'myDbConnection',
'connectionString' => 'mysql:host=localhost;dbname=test;charset=utf8',
'tablePrefix' => 'cdb_',
'username' => 'root',
),
),
修改默认的db组件所使用的类:
components=>array(
'db' => array(
'class' => 'myDbConnection',
... ...
),
),

相关推荐:

简述Yii2队列shmilyzxt/yii2-queue

详解YII2多表关联的使用

详解yii2 csrf的局部开关

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