首頁 後端開發 php教程 淺析Yii框架的組件化機制

淺析Yii框架的組件化機制

Jan 05, 2018 pm 05:21 PM
機制 框架 組件

本文主要介紹了PHP的Yii框架的組件化機制的基本知識,對應用程式CWebApplication元件進行了簡要剖析,需要的朋友可以參考下。

元件是 Yii 應用的主要基石。是 yii\base\Component 類別或其子類別的實例。三個用以區分它和其它類別的主要功能有:

  • 屬性(Property)

  • ##事件(Event)

  • 行為(Behavior)

或單獨使用,或彼此配合,這些函數的應用讓Yii 的類別變得更加靈活和易用。以小工具yii\jui\DatePicker 來舉例,這是個方便你在視圖中產生一個互動式日期選擇器的UI 元件:

use yii\jui\DatePicker;

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

這個小元件繼承自yii\base\Component,它的各項屬性改寫起來會很容易。

正是因為元件功能的強大,他們比常規的物件(Object)稍微重量級一點,因為他們要使用額外的記憶體和 CPU 時間來處理 事件 和 行為 。如果你不需要這兩個功能,可以繼承 yii\base\Object 而不是 yii\base\Component。這樣元件可以像普通 PHP 物件一樣高效,同時也支援屬性(Property)功能。

當繼承yii\base\Component 或yii\base\Object 時,推薦你使用如下的編碼風格:

如果你需要重寫建構方法(Constructor),傳入$config作為建構器方法最後一個參數,然後把它傳遞給父類別的建構方法。

永遠在你重寫的建構方法結尾處呼叫一下父類別的建構方法。
如果你重寫了 yii\base\Object::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( ) 的方法看起來更加複雜,但這主要因為它更加靈活強大,它是基於依賴注入容器實現的。

yii\base\Object 類別執行時的生命週期如下:

建構方法內的預初始化過程。你可以在這裡給各屬性設定缺省值。

透過 $config 配置物件。配置的過程可能會覆寫先前在構造方法內設定的預設值。
在 yii\base\Object::init() 方法內進行初始化後的收尾工作。你可以透過重寫此方法,進行一些良品檢驗,屬性的初始化之類的工作。
物件方法呼叫。
前三步都是在物件的建構方法內發生的。這意味著一旦你獲得了一個物件實例,那麼它就已經初始化就緒可供使用。

應用程式CWebApplication元件
在說明Yii中各個元件使用方法前,先了解最重要的一個元件CWebApplication。 CWebApplication即應用程式對象,它的根類別也是CComponent,故它也是一個元件,具有Yii元件的共同特徵。
具體來說,CWebApplication元件的主要作用是根據設定文件,載入必要的輔助元件,並在這些元件的幫助下(如urlManager)建立並執行控制器。故也稱為前端控制器。
我們可以在設定檔中指定CWebApplication元件本身的設定參數,這些參數被設定為其公共成員變量,或是自動呼叫setter方法設定屬性,這個特性可以在CWebApplication的建構子中發現:$this- >configure($config);
如在設定檔protected/config/main.php全域中指定:

'charset' => 'utf-8',
登入後複製

這實際上是設定目前應用程式的charset公用屬性(在CApplication中宣告)而如果在設定檔中指定'language' => 'zh_cn', 我們發現CWebApplication及其所有上級類別均未宣告$language屬性,這時將使用setter模式方法即setlanuage(此方法定義在CApplication類別中) 。

OK,在了解這個特性之後,我們就可以明白在設定檔中可以設定的屬性:

  • CWebApplication及其所有上級類別的公用成員變數

  • CWebApplication及其所有上級類別的setter方法指定的屬性當然我們也可以透過繼承CWebApplication來建構自己的應用程式類別。

CWebApplication的繼承層次為:CApplication -> CModule -> CComponent, 我們將預設的設定檔中常見的設定項及其生效位置說明:

  • basePath :  CApplication::setBasePath()

  • #name: CApplication::$name

  • preload: CModule ::$preload

  • import: CModule::setImport()

  • defaultController: CWebApplication::$defaultController

  • #components: CModule::setComponents()

#類似地,再列出幾個預設設定檔中並未列出的設定項:timezone: CApplication:: setTimeZone()  #設定時區

再例如,如果我们继承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中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

如何評估Java框架商業支援的性價比 如何評估Java框架商業支援的性價比 Jun 05, 2024 pm 05:25 PM

評估Java框架商業支援的性價比涉及以下步驟:確定所需的保障等級和服務等級協定(SLA)保證。研究支持團隊的經驗和專業知識。考慮附加服務,如昇級、故障排除和效能最佳化。權衡商業支援成本與風險緩解和提高效率。

PHP 框架的學習曲線與其他語言框架相比如何? PHP 框架的學習曲線與其他語言框架相比如何? Jun 06, 2024 pm 12:41 PM

PHP框架的學習曲線取決於語言熟練度、框架複雜性、文件品質和社群支援。與Python框架相比,PHP框架的學習曲線較高,而與Ruby框架相比,則較低。與Java框架相比,PHP框架的學習曲線中等,但入門時間較短。

PHP 框架的輕量級選項如何影響應用程式效能? PHP 框架的輕量級選項如何影響應用程式效能? Jun 06, 2024 am 10:53 AM

輕量級PHP框架透過小體積和低資源消耗提升應用程式效能。其特點包括:體積小,啟動快,記憶體佔用低提升響應速度和吞吐量,降低資源消耗實戰案例:SlimFramework創建RESTAPI,僅500KB,高響應性、高吞吐量

Java框架的效能比較 Java框架的效能比較 Jun 04, 2024 pm 03:56 PM

根據基準測試,對於小型、高效能應用程序,Quarkus(快速啟動、低記憶體)或Micronaut(TechEmpower優異)是理想選擇。 SpringBoot適用於大型、全端應用程序,但啟動時間和記憶體佔用稍慢。

golang框架文件最佳實踐 golang框架文件最佳實踐 Jun 04, 2024 pm 05:00 PM

編寫清晰全面的文件對於Golang框架至關重要。最佳實踐包括:遵循既定文件風格,例如Google的Go程式設計風格指南。使用清晰的組織結構,包括標題、子標題和列表,並提供導覽。提供全面且準確的信息,包括入門指南、API參考和概念。使用程式碼範例說明概念和使用方法。保持文件更新,追蹤變更並記錄新功能。提供支援和社群資源,例如GitHub問題和論壇。建立實際案例,如API文件。

如何為不同的應用場景選擇最佳的golang框架 如何為不同的應用場景選擇最佳的golang框架 Jun 05, 2024 pm 04:05 PM

根據應用場景選擇最佳Go框架:考慮應用類型、語言特性、效能需求、生態系統。常見Go框架:Gin(Web應用)、Echo(Web服務)、Fiber(高吞吐量)、gorm(ORM)、fasthttp(速度)。實戰案例:建構RESTAPI(Fiber),與資料庫互動(gorm)。選擇框架:效能關鍵選fasthttp,靈活Web應用選Gin/Echo,資料庫互動選gorm。

Java框架學習路線圖:不同領域中的最佳實踐 Java框架學習路線圖:不同領域中的最佳實踐 Jun 05, 2024 pm 08:53 PM

針對不同領域的Java框架學習路線圖:Web開發:SpringBoot和PlayFramework。持久層:Hibernate和JPA。服務端響應式程式設計:ReactorCore和SpringWebFlux。即時計算:ApacheStorm和ApacheSpark。雲端運算:AWSSDKforJava和GoogleCloudJava。

Golang框架學習過程中常見的迷思有哪些? Golang框架學習過程中常見的迷思有哪些? Jun 05, 2024 pm 09:59 PM

Go框架學習的迷思有以下5種:過度依賴框架,限制彈性。不遵循框架約定,程式碼難以維護。使用過時庫,帶來安全和相容性問題。過度使用包,混淆程式碼結構。忽視錯誤處理,導致意外行為和崩潰。

See all articles