Heim Backend-Entwicklung PHP-Tutorial Eine kurze Analyse des Komponentisierungsmechanismus des Yii-Frameworks

Eine kurze Analyse des Komponentisierungsmechanismus des Yii-Frameworks

Jan 05, 2018 pm 05:21 PM
机制 框架 组件

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',
  ],
]);
Nach dem Login kopieren

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

    // ... 配置生效后的初始化过程
  }
}
Nach dem Login kopieren

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]);
Nach dem Login kopieren

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',
Nach dem Login kopieren

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',
),
);
Nach dem Login kopieren

就设置了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',
... ...
),
),
Nach dem Login kopieren

相关推荐:

简述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!

Erklärung dieser Website
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

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

So bewerten Sie die Kosteneffizienz der kommerziellen Unterstützung für Java-Frameworks So bewerten Sie die Kosteneffizienz der kommerziellen Unterstützung für Java-Frameworks Jun 05, 2024 pm 05:25 PM

Die Bewertung des Kosten-/Leistungsverhältnisses des kommerziellen Supports für ein Java-Framework umfasst die folgenden Schritte: Bestimmen Sie das erforderliche Maß an Sicherheit und Service-Level-Agreement-Garantien (SLA). Die Erfahrung und das Fachwissen des Forschungsunterstützungsteams. Erwägen Sie zusätzliche Services wie Upgrades, Fehlerbehebung und Leistungsoptimierung. Wägen Sie die Kosten für die Geschäftsunterstützung gegen Risikominderung und Effizienzsteigerung ab.

Wie wirken sich die Lightweight-Optionen von PHP-Frameworks auf die Anwendungsleistung aus? Wie wirken sich die Lightweight-Optionen von PHP-Frameworks auf die Anwendungsleistung aus? Jun 06, 2024 am 10:53 AM

Das leichte PHP-Framework verbessert die Anwendungsleistung durch geringe Größe und geringen Ressourcenverbrauch. Zu seinen Merkmalen gehören: geringe Größe, schneller Start, geringer Speicherverbrauch, verbesserte Reaktionsgeschwindigkeit und Durchsatz sowie reduzierter Ressourcenverbrauch. Praktischer Fall: SlimFramework erstellt eine REST-API, nur 500 KB, hohe Reaktionsfähigkeit und hoher Durchsatz

Wie ist die Lernkurve von PHP-Frameworks im Vergleich zu anderen Sprach-Frameworks? Wie ist die Lernkurve von PHP-Frameworks im Vergleich zu anderen Sprach-Frameworks? Jun 06, 2024 pm 12:41 PM

Die Lernkurve eines PHP-Frameworks hängt von Sprachkenntnissen, Framework-Komplexität, Dokumentationsqualität und Community-Unterstützung ab. Die Lernkurve von PHP-Frameworks ist im Vergleich zu Python-Frameworks höher und im Vergleich zu Ruby-Frameworks niedriger. Im Vergleich zu Java-Frameworks haben PHP-Frameworks eine moderate Lernkurve, aber eine kürzere Einstiegszeit.

Leistungsvergleich von Java-Frameworks Leistungsvergleich von Java-Frameworks Jun 04, 2024 pm 03:56 PM

Laut Benchmarks sind Quarkus (schneller Start, geringer Speicher) oder Micronaut (TechEmpower ausgezeichnet) für kleine, leistungsstarke Anwendungen die ideale Wahl. SpringBoot eignet sich für große Full-Stack-Anwendungen, weist jedoch etwas langsamere Startzeiten und Speichernutzung auf.

Best Practices für die Dokumentation des Golang-Frameworks Best Practices für die Dokumentation des Golang-Frameworks Jun 04, 2024 pm 05:00 PM

Das Verfassen einer klaren und umfassenden Dokumentation ist für das Golang-Framework von entscheidender Bedeutung. Zu den Best Practices gehört die Befolgung eines etablierten Dokumentationsstils, beispielsweise des Go Coding Style Guide von Google. Verwenden Sie eine klare Organisationsstruktur, einschließlich Überschriften, Unterüberschriften und Listen, und sorgen Sie für eine Navigation. Bietet umfassende und genaue Informationen, einschließlich Leitfäden für den Einstieg, API-Referenzen und Konzepte. Verwenden Sie Codebeispiele, um Konzepte und Verwendung zu veranschaulichen. Halten Sie die Dokumentation auf dem neuesten Stand, verfolgen Sie Änderungen und dokumentieren Sie neue Funktionen. Stellen Sie Support und Community-Ressourcen wie GitHub-Probleme und Foren bereit. Erstellen Sie praktische Beispiele, beispielsweise eine API-Dokumentation.

So wählen Sie das beste Golang-Framework für verschiedene Anwendungsszenarien aus So wählen Sie das beste Golang-Framework für verschiedene Anwendungsszenarien aus Jun 05, 2024 pm 04:05 PM

Wählen Sie das beste Go-Framework basierend auf Anwendungsszenarien aus: Berücksichtigen Sie Anwendungstyp, Sprachfunktionen, Leistungsanforderungen und Ökosystem. Gängige Go-Frameworks: Gin (Webanwendung), Echo (Webdienst), Fiber (hoher Durchsatz), gorm (ORM), fasthttp (Geschwindigkeit). Praktischer Fall: Erstellen einer REST-API (Fiber) und Interaktion mit der Datenbank (gorm). Wählen Sie ein Framework: Wählen Sie fasthttp für die Schlüsselleistung, Gin/Echo für flexible Webanwendungen und gorm für die Datenbankinteraktion.

Roadmap zum Java Framework-Lernen: Best Practices in verschiedenen Bereichen Roadmap zum Java Framework-Lernen: Best Practices in verschiedenen Bereichen Jun 05, 2024 pm 08:53 PM

Roadmap zum Java-Framework-Lernen für verschiedene Bereiche: Webentwicklung: SpringBoot und PlayFramework. Persistenzschicht: Ruhezustand und JPA. Serverseitige reaktive Programmierung: ReactorCore und SpringWebFlux. Echtzeit-Computing: ApacheStorm und ApacheSpark. Cloud Computing: AWS SDK für Java und Google Cloud Java.

Was sind die häufigsten Missverständnisse im Lernprozess des Golang-Frameworks? Was sind die häufigsten Missverständnisse im Lernprozess des Golang-Frameworks? Jun 05, 2024 pm 09:59 PM

Beim Go-Framework-Lernen gibt es fünf Missverständnisse: übermäßiges Vertrauen in das Framework und eingeschränkte Flexibilität. Wenn Sie die Framework-Konventionen nicht befolgen, wird es schwierig, den Code zu warten. Die Verwendung veralteter Bibliotheken kann zu Sicherheits- und Kompatibilitätsproblemen führen. Die übermäßige Verwendung von Paketen verschleiert die Codestruktur. Das Ignorieren der Fehlerbehandlung führt zu unerwartetem Verhalten und Abstürzen.

See all articles