検索
ホームページバックエンド開発PHPチュートリアルYii フレームワークのコンポーネント化メカニズムの簡単な分析
Yii フレームワークのコンポーネント化メカニズムの簡単な分析Jan 05, 2018 pm 05:21 PM
機構フレームコンポーネント

この記事では、主に PHP の Yii フレームワークのコンポーネント化メカニズムの基本的な知識を紹介し、アプリケーションの CWebApplication コンポーネントについて簡単に分析します。必要な方は参考にしてください。

コンポーネントは Yii アプリケーションの主要な基礎です。 yiibaseComponent クラスまたはそのサブクラスのインスタンスです。他のクラスと区別するために使用される 3 つの主な関数は次のとおりです:

  • Property

  • Event

  • Behavior

、または単独で、または相互に組み合わせて使用​​され、これらの関数の適用により Yii クラスが作成されます。より柔軟で使いやすくなりました。ウィジェット yiijuiDatePicker を例に挙げます。これは、ビュー内で対話型の日付ピッカーを生成できる UI コンポーネントです。

use yii\jui\DatePicker;

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

このウィジェットは yiibaseComponent から継承しており、そのプロパティは簡単に書き換えることができます。

コンポーネントの強力な機能により、イベントや動作の処理に追加のメモリと CPU 時間を使用するため、通常のオブジェクト (オブジェクト) よりもわずかに重くなります。これら 2 つの機能が必要ない場合は、yiibaseComponent の代わりに yiibaseObject を継承できます。このようにして、コンポーネントは、プロパティ関数もサポートしながら、通常の PHP オブジェクトと同じくらい効率的になります。

yiibaseComponent または yiibaseObject を継承するときは、次のコーディング スタイルを使用することをお勧めします:

コンストラクター (Constructor) をオーバーライドする必要がある場合は、コンストラクター メソッドの最後のパラメーターとして $config を渡し、それを に渡します。親クラス。
常に、オーバーライドされたコンストラクターの最後で親クラスのコンストラクターを呼び出します。
yiibaseObject::init() メソッドをオーバーライドする場合は、必ず init メソッドの先頭で親クラスの init メソッドを呼び出してください。
例は以下のとおりです:

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

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

なお、インスタンス作成時にコンポーネントが正しく設定されるようにするには、以下の操作手順に従ってください:

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

補足: Yii::createObject() の呼び出し方法は次のようになりますが、これはより複雑ですが、これは主に、より柔軟で強力であり、依存関係注入コンテナーに基づいて実装されているためです。
実行時の yiibaseObject クラスのライフサイクルは次のとおりです:

コンストラクター メソッド内の事前初期化プロセス。ここで各プロパティのデフォルト値を設定できます。
$config を通じてオブジェクトを設定します。構成プロセスにより、コンストラクターで以前に設定されたデフォルト値が上書きされる場合があります。
yiibaseObject::init() メソッドで初期化後の仕上げ作業を実行します。このメソッドをオーバーライドして、品質検査や属性の初期化などの作業を実行できます。
オブジェクトメソッド呼び出し。
最初の 3 つのステップはすべて、オブジェクトのコンストラクター内で発生します。これは、オブジェクト インスタンスを取得すると、初期化されて使用できる状態になることを意味します。

アプリケーション CWebApplication コンポーネント
Yii の各コンポーネントの使用方法を説明する前に、まず最も重要なコンポーネント CWebApplication について理解しましょう。 CWebApplication はアプリケーション オブジェクトであり、そのルート クラスも CComponent であるため、コンポーネントでもあり、Yii コンポーネントの共通の特性を備えています。
具体的には、CWebApplication コンポーネントの主な機能は、構成ファイルに従って必要な補助コンポーネントをロードし、これらのコンポーネント (urlManager など) を利用してコントローラーを作成して実行することです。そのため、フロントエンドコントローラーとも呼ばれます。
CWebApplication コンポーネント自体の構成パラメーターを構成ファイルで指定できます。これらのパラメーターは、そのパブリック メンバー変数に設定されます。または、プロパティを設定するために setter メソッドが自動的に呼び出されます。この機能は、CWebApplication のコンストラクター内にあります。 this->configure($config);
設定ファイル protected/config/main.php でグローバルに指定されている場合:

'charset' => 'utf-8',

これは実際に現在のアプリケーション (CApplication で宣言されている) の charset パブリック プロパティを設定します。構成ファイル' language' => 'zh_cn' を実行すると、CWebApplication とそのすべての上位クラスが $ language 属性を宣言していないことがわかりました。この場合、セッター モード メソッド setlanuage が使用されます (このメソッドは CApplication で定義されています)。クラス)。
OK、この機能を理解すると、設定ファイルで設定できる属性を理解できるようになります:

  • CWebApplication とそのすべての上位クラスのパブリック メンバー変数

  • CWebApplication とすべての setter メソッドによって指定その上位クラスのプロパティ もちろん、CWebApplication を継承して独自のアプリケーション クラスを構築することもできます。

CWebApplication の継承レベルは次のとおりです: CApplication -> CModule -> デフォルト設定ファイル内の共通の設定項目とその有効な場所について説明します:

  • basePath: CApplication::setBasePath()

  • 名前: CApplication::$name

  • プリロード: CModule::$preload

  • インポート: CModule::setImport()

  • defaultController: CWebApplication::$defaultController

  • コンポーネント: CModule::setComponents()

同様に、デフォルト設定ファイルにリストされていない設定項目をさらにいくつかリストします: timezone: CApplication::setTimeZone() #Configure timezone

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

以上がYii フレームワークのコンポーネント化メカニズムの簡単な分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
聊聊Vue怎么通过JSX动态渲染组件聊聊Vue怎么通过JSX动态渲染组件Dec 05, 2022 pm 06:52 PM

Vue怎么通过JSX动态渲染组件?下面本篇文章给大家介绍一下Vue高效通过JSX动态渲染组件的方法,希望对大家有所帮助!

VSCode插件分享:一个实时预览Vue/React组件的插件VSCode插件分享:一个实时预览Vue/React组件的插件Mar 17, 2022 pm 08:07 PM

在VSCode中开发Vue/React组件时,怎么实时预览组件?本篇文章就给大家分享一个VSCode 中实时预览Vue/React组件的插件,希望对大家有所帮助!

深入了解CSS布局重新计算和渲染的机制深入了解CSS布局重新计算和渲染的机制Jan 26, 2024 am 09:11 AM

CSS回流(reflow)和重绘(repaint)是网页性能优化中非常重要的概念。在开发网页时,了解这两个概念的工作原理,可以帮助我们提高网页的响应速度和用户体验。本文将深入探讨CSS回流和重绘的机制,并提供具体的代码示例。一、CSS回流(reflow)是什么?当DOM结构中的元素发生可视性、尺寸或位置改变时,浏览器需要重新计算并应用CSS样式,然后重新布局

深入探讨Golang变量的存储位置和机制深入探讨Golang变量的存储位置和机制Feb 28, 2024 pm 09:45 PM

标题:深入探讨Golang变量的存储位置和机制随着Go语言(Golang)在云计算、大数据和人工智能领域的应用逐渐增多,深入了解Golang变量的存储位置和机制变得尤为重要。在本文中,我们将详细探讨Golang中变量的内存分配、存储位置以及相关的机制。通过具体代码示例,帮助读者更好地理解Golang变量在内存中是如何存储和管理的。1.Golang变量的内存

PHP中的自动加载机制PHP中的自动加载机制Jun 18, 2023 pm 01:11 PM

随着PHP语言越来越受欢迎,开发人员需要使用越来越多的类和函数。当项目规模扩大时,手动引入所有依赖项将变得不切实际。这时候就需要一种自动加载机制来简化代码开发和维护过程。自动加载机制是一种PHP语言的特性,可以在运行时自动载入所需的类和接口,并减少手动的类文件引入。这样,程序员可以专注于开发代码,减少因繁琐的手动类引入而产生的错误和时间浪费。在PHP中,一般

Go语言垃圾回收机制详解Go语言垃圾回收机制详解Mar 26, 2024 pm 02:42 PM

Go语言(也称为Golang)是谷歌开发的一种高效的编程语言,具有并发性和垃圾回收机制等特点。本文将详细解释Go语言中的垃圾回收机制,包括其原理、实现方式以及代码示例。1.垃圾回收原理Go语言的垃圾回收机制是通过“标记-清除”算法实现的。在程序运行过程中,Go运行时会在堆中跟踪哪些对象是可以被访问的(被标记),而哪些对象是无法被访问的,即垃圾数据(需要清除

Go 语言中的内存管理机制是怎样的?Go 语言中的内存管理机制是怎样的?Jun 10, 2023 pm 04:04 PM

Go语言是一门广泛用于系统级编程的高效编程语言,其主要优势之一是其内存管理机制。Go语言内建的垃圾回收机制(GarbageCollection,简称GC)使得程序员不必亲自进行内存分配和释放操作,提高了开发效率和代码质量。本文将对Go语言中的内存管理机制进行详细介绍。一、Go内存分配在Go语言中,内存分配使用了两个堆区:小对象堆(small

PHP中的隐式转换机制解析PHP中的隐式转换机制解析Mar 09, 2024 am 08:00 AM

PHP中的隐式转换机制解析在PHP编程中,隐式转换是指在不显式指定类型转换的情况下,PHP自动将一个数据类型转换为另一个数据类型的过程。隐式转换机制在编程中非常常见,但也容易造成一些意想不到的bug,因此了解隐式转换机制的原理和规则对于编写稳健的PHP代码非常重要。1.整型与浮点型之间的隐式转换在PHP中,整型和浮点型之间的隐式转换是非常常见的。当一个整型

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

SublimeText3 英語版

SublimeText3 英語版

推奨: Win バージョン、コードプロンプトをサポート!

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

WebStorm Mac版

WebStorm Mac版

便利なJavaScript開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

SublimeText3 Linux 新バージョン

SublimeText3 Linux 新バージョン

SublimeText3 Linux 最新バージョン