Heim  >  Artikel  >  Backend-Entwicklung  >  Eine kurze Analyse des Komponentisierungsmechanismus des Yii-Frameworks

Eine kurze Analyse des Komponentisierungsmechanismus des Yii-Frameworks

*文
*文Original
2018-01-05 17:21:201663Durchsuche

In diesem Artikel werden hauptsächlich die Grundkenntnisse des Komponentisierungsmechanismus des Yii-Frameworks von PHP vorgestellt und die CWebApplication-Komponente der Anwendung kurz analysiert.

Komponenten sind die Hauptbausteine ​​von Yii-Anwendungen. Ist eine Instanz der yiibaseComponent-Klasse oder ihrer Unterklassen. Die drei Hauptfunktionen zur Unterscheidung von anderen Klassen sind:

  • Eigenschaft

  • Ereignis

  • Verhalten

Ob einzeln oder in Verbindung miteinander verwendet, macht die Anwendung dieser Funktionen Yii-Klassen flexibler und benutzerfreundlicher. Nehmen Sie als Beispiel das Widget yiijuiDatePicker. Dies ist eine UI-Komponente, mit der Sie eine interaktive Datumsauswahl in der Ansicht erstellen können:

use yii\jui\DatePicker;

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

Dieses Widget erbt von yiibaseComponent und seine verschiedenen Eigenschaften sind sehr schwierig einfach umschreiben.

Gerade aufgrund der leistungsstarken Funktionen von Komponenten sind sie etwas schwerer als normale Objekte (Object), da sie zusätzlichen Speicher und CPU-Zeit benötigen, um Ereignisse und Verhaltensweisen zu verarbeiten. Wenn Sie diese beiden Funktionen nicht benötigen, können Sie yiibaseObject anstelle von yiibaseComponent erben. Auf diese Weise kann die Komponente genauso effizient sein wie ein normales PHP-Objekt und gleichzeitig die Eigenschaftsfunktion unterstützen.

Beim Erben von yiibaseComponent oder yiibaseObject wird empfohlen, den folgenden Codierungsstil zu verwenden:

Wenn Sie den Konstruktor (Constructor) überschreiben müssen, übergeben Sie $config als letzten Parameter des Konstruktormethode. Übergeben Sie sie dann an den Konstruktor der übergeordneten Klasse.
Rufen Sie den Konstruktor der übergeordneten Klasse immer am Ende Ihres überschriebenen Konstruktors auf.
Wenn Sie die Methode yiibaseObject::init() überschreiben, stellen Sie bitte sicher, dass Sie die Init-Methode der übergeordneten Klasse am Anfang der Init-Methode aufrufen.
Ein Beispiel lautet wie folgt:

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

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

Damit die Komponente beim Erstellen einer Instanz korrekt konfiguriert wird, befolgen Sie außerdem bitte den folgenden Vorgang:

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

Zusätzlich: Selbst wenn Sie Yii aufrufen, sieht die Methode ::createObject() komplizierter aus, aber das liegt hauptsächlich daran, dass sie flexibler und leistungsfähiger ist und auf dem Abhängigkeitsinjektionscontainer basiert.
Der Lebenszyklus der yiibaseObject-Klasse während der Ausführung ist wie folgt:

Vorinitialisierungsprozess innerhalb des Konstruktors. Hier können Sie für jede Eigenschaft Standardwerte festlegen.
Objekte über $config konfigurieren. Der Konfigurationsprozess überschreibt möglicherweise die zuvor im Konstruktor festgelegten Standardwerte.
Führen Sie die Abschlussarbeiten nach der Initialisierung in der Methode yiibaseObject::init() durch. Sie können diese Methode überschreiben, um einige Arbeiten wie Qualitätsprüfung und Attributinitialisierung durchzuführen.
Objektmethodenaufruf.
Die ersten drei Schritte erfolgen alle im Konstruktor des Objekts. Das bedeutet, dass, sobald Sie eine Objektinstanz erhalten, diese initialisiert und einsatzbereit ist.

Application CWebApplication-Komponente
Bevor wir erklären, wie die einzelnen Komponenten in Yii verwendet werden, wollen wir zunächst die wichtigste Komponente, CWebApplication, verstehen. CWebApplication ist das Anwendungsobjekt und seine Stammklasse ist ebenfalls CComponent. Daher ist es auch eine Komponente und weist die gemeinsamen Merkmale von Yii-Komponenten auf.
Konkret besteht die Hauptfunktion der CWebApplication-Komponente darin, die erforderlichen Hilfskomponenten gemäß der Konfigurationsdatei zu laden und den Controller mit Hilfe dieser Komponenten (z. B. URLManager) zu erstellen und auszuführen. Daher wird er auch als Front-End-Controller bezeichnet.
Wir können die Konfigurationsparameter der CWebApplication-Komponente selbst in der Konfigurationsdatei angeben. Diese Parameter werden auf ihre öffentlichen Mitgliedsvariablen festgelegt, oder die Setter-Methode wird automatisch aufgerufen, um Eigenschaften festzulegen. Diese Funktion befindet sich im Konstruktor von CWebApplication : $this- >configure($config);
Wie in der Konfigurationsdatei protected/config/main.php global angegeben:

'charset' => 'utf-8',

Dies legt tatsächlich die öffentliche Zeichensatzeigenschaft der aktuellen Anwendung fest (in der CApplication-Deklaration) und wenn in der Konfigurationsdatei „Language“ => „zh_cn“ angegeben ist, stellen wir fest, dass CWebApplication und alle seine übergeordneten Klassen das Attribut „$Language“ nicht deklarieren. In diesem Fall ist die Setter-Modus-Methode setlanuage. verwendet wird (diese Methode ist in der CApplication-Klassenmitte definiert).
OK, nachdem wir diese Funktion verstanden haben, können wir die Attribute verstehen, die in der Konfigurationsdatei konfiguriert werden können:

  • Öffentliche Mitgliedsvariablen von CWebApplication und allen seinen übergeordneten Klassen

  • Attribute, die von den Setter-Methoden von CWebApplication und allen seinen übergeordneten Klassen angegeben werden. Natürlich können wir auch unsere eigene Anwendungsklasse erstellen, indem wir CWebApplication erben.

Die Vererbungshierarchie von CWebApplication ist: CApplication -> CModule -> 🎜>

    basePath: CApplication::setBasePath()
  • name: CApplication::$name
  • preload: CModule ::$preload
  • import: CModule::setImport()
  • defaultController: CWebApplication::$defaultController
  • components: CModule::setComponents()
  • Auf ähnliche Weise mehrere Konfigurationselemente auflisten, die nicht in der Standardkonfigurationsdatei aufgeführt sind: timezone: CApplication:: setTimeZone() # Zeitzone konfigurieren

再例如,如果我们继承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的局部开关

Das obige ist der detaillierte Inhalt vonEine kurze Analyse des Komponentisierungsmechanismus des Yii-Frameworks. 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