由於擴充意味著是第三方開發者使用,需要一些額外的努力去創建它。以下是一些一般性的指導原則:
*擴展最好是自己自給自足。也就是說,其外部的依賴應是最少的。如果使用者的擴充功能需要安裝額外的軟體包,類別或資源檔案,這將是一個頭痛的問題。 *檔案屬於同一個擴充的,應組織在同一目錄下,目錄名稱用擴充名稱。 *擴展裡面的類別應使用一些單字字母前綴,以避免與其他擴展命名衝突。 *擴充功能應該提供詳細的安裝和API文件。這將減少其他開發員使用擴充時所花費的時間和精力。 *擴展應該用適當的許可。如果您認為您的擴充功能在開源和閉源專案中使用,您可以考慮使用許可證,如BSD的,麻省理工學院等,但不是GPL的,因為它要求其衍生的程式碼是開源的。
在下面,我們根據 overview中所描述的分類,描述如何建立一個新的擴充。當您要建立一個主要用於在您自己專案的component零件,這些描述也適用。
1. Application Component(應用程式元件)
一個application component 應實作介面IApplicationComponent或繼承CApplicationComponent。主要需要實作的方法是 IApplicationComponent::init,元件在此執行一些初始化工作。此方法在部件建立和屬性值(在application configuration裡指定的 )被賦值後呼叫。
預設情況下,一個應用程式部件創建和初始化,只有當它首次訪問期間要求處理。如果一個應用程式元件需要在應用程式實例被創建後創建,它應要求使用者在CApplication::preload 的屬性中列出他的編號。
2. Behavior
To create a behavior, one must implement the IBehavior interface. For convenience, Yii provides a base class CBehavior that already implements methodface and provides someface they intend to make。 cord. For example, the CActiveRecordBehavior class implements a set of methods to respond to the life cycle events raised in an ActiveRecord object. A child class can thus override these methods to put in customized codei will 膜 pate 區example of an ActiveRecord behavior. When this behavior is attached to an AR object and when the AR object is being saved by calling
save(), it will auto. timestamp.
class TimestampBehavior extends CActiveRecordBehavior { public function beforeSave($event) { if($this->owner->isNewRecord) $this->owner->create_time=time(); else $this->owner->update_time=time(); } }
3. Widget(小工具)
widget應繼承CWidget或其子類別。 A widget should extend from CWidget or its child classes.
最簡單的方式建立一個新的小工具是繼承一個現成的小工具和重載它的方法或改變其預設的屬性值。例如,如果您想要為CTabView使用更好的CSS樣式,您可以配置其CTabView::cssFile屬性,當使用的小工具時。您也可以繼承CTabView如下,讓您在使用小工具時,不再需要配置屬性。
class MyTabView extends CTabView { public function init() { if($this->cssFile===null) { $file=dirname(__FILE__).DIRECTORY_SEPARATOR.'tabview.css'; $this->cssFile=Yii::app()->getAssetManager()->publish($file); } parent::init(); } }在上面的,我們重載CWidget::init方法和指定CTabView::cssFile的URL到我們的新的預設CSS樣式如果此屬性未設定時。我們把新的CSS樣式檔案和
MyTabView
類檔案放在相同的目錄下,以便他們能夠封裝成擴充。由於CSS樣式文件不是透過Web訪問,我們需要發布作為asset資源。
要從零開始建立一個新的小工具,我們主要是需要實作兩個方法:CWidget::init 和CWidget::run。第一種方法是當我們在視圖中使用
$this->beginWidget插入一個小工具時被調用,第二種方法在
$this->endWidget被調用時調用。如果我們想要在這兩個方法呼叫之間捕捉和處理顯示的內容,我們可以開始output buffering在CWidget::init 和在CWidget::run中回收緩衝輸出作進一步處理。 If we want to capture and process the content displayed between these two method invocations, we can start output buffering in CWidget::init and retrieve the buffered output in CWidget::run for further processing.<p>在网页中使用的小工具,小工具往往包括CSS,Javascript或其他资源文件。我们叫这些文件<em>assets</em>,因为他们和小工具类在一起,而且通常Web用户无法访问。为了使这些档案通过Web访问,我们需要用CWebApplication::assetManager发布他们,例如上述代码段所示。此外,如果我们想包括CSS或JavaScript文件在当前的网页,我们需要使用CClientScript注册 :</p>
<p><br></p>
<p></p>
<pre class="brush:php;toolbar:false">class MyWidget extends CWidget
{
protected function registerClientScript()
{
// ...publish CSS or JavaScript file here...
$cs=Yii::app()->clientScript;
$cs->registerCssFile($cssFile);
$cs->registerScriptFile($jsFile);
}
}</pre>
<p></p>
<p>小工具也可能有自己的视图文件。如果是这样,创建一个目录命名<code>views
在包括小工具类文件的目录下,并把所有的视图文件放里面。在小工具类中使用$this->render('ViewName')
来render渲染小工具视图,类似于我们在控制器里做。
4. Action(动作)
action应继承CAction或者其子类。action要实现的主要方法是IAction::run 。
5. Filter(过滤器)
filter应继承CFilter 或者其子类。filter要实现的主要方法是CFilter::preFilter和CFilter::postFilter。前者是在action之前被执行,而后者是在之后。
class MyFilter extends CFilter { protected function preFilter($filterChain) { // logic being applied before the action is executed return true; // false if the action should not be executed } protected function postFilter($filterChain) { // logic being applied after the action is executed } }
参数$filterChain
的类型是CFilterChain,其包含当前被filter的action的相关信息。
6. Controller(控制器)
controller要作为扩展需继承CExtController,而不是 CController。主要的原因是因为CController 认定控制器视图文件位于application.views.ControllerID
下,而CExtController认定视图文件在views
目录下,也是包含控制器类目录的一个子目录。因此,很容易重新分配控制器,因为它的视图文件和控制类是在一起的。
7. Validator(验证)
Validator需继承CValidator和实现CValidator::validateAttribute方法。
class MyValidator extends CValidator { protected function validateAttribute($model,$attribute) { $value=$model->$attribute; if($value has error) $model->addError($attribute,$errorMessage); } }
8. Console Command(控制台命令)
console command 应继承CConsoleCommand和实现CConsoleCommand::run方法。 或者,我们可以重载CConsoleCommand::getHelp来提供 一些更好的有关帮助命令。
class MyCommand extends CConsoleCommand { public function run($args) { // $args gives an array of the command-line arguments for this command } public function getHelp() { return 'Usage: how to use this command'; } }
9. Module(模块)
请参阅modules一节中关于就如何创建一个模块。
一般准则制订一个模块,它应该是独立的。模块所使用的资源文件(如CSS , JavaScript ,图片),应该和模块一起分发。还有模块应发布它们,以便可以Web访问它们 。
10. Generic Component(通用组件)
开发一个通用组件扩展类似写一个类。还有,该组件还应该自足,以便它可以很容易地被其他开发者使用。
以上就是Yii框架官方指南系列35——扩展Yii:创建扩展的内容,更多相关内容请关注PHP中文网(www.php.cn)!

PHPSession失效的原因包括配置錯誤、Cookie問題和Session過期。 1.配置錯誤:檢查並設置正確的session.save_path。 2.Cookie問題:確保Cookie設置正確。 3.Session過期:調整session.gc_maxlifetime值以延長會話時間。

在PHP中調試會話問題的方法包括:1.檢查會話是否正確啟動;2.驗證會話ID的傳遞;3.檢查會話數據的存儲和讀取;4.查看服務器配置。通過輸出會話ID和數據、查看會話文件內容等方法,可以有效診斷和解決會話相關的問題。

多次調用session_start()會導致警告信息和可能的數據覆蓋。 1)PHP會發出警告,提示session已啟動。 2)可能導致session數據意外覆蓋。 3)使用session_status()檢查session狀態,避免重複調用。

在PHP中配置會話生命週期可以通過設置session.gc_maxlifetime和session.cookie_lifetime來實現。 1)session.gc_maxlifetime控制服務器端會話數據的存活時間,2)session.cookie_lifetime控制客戶端cookie的生命週期,設置為0時cookie在瀏覽器關閉時過期。

使用數據庫存儲會話的主要優勢包括持久性、可擴展性和安全性。 1.持久性:即使服務器重啟,會話數據也能保持不變。 2.可擴展性:適用於分佈式系統,確保會話數據在多服務器間同步。 3.安全性:數據庫提供加密存儲,保護敏感信息。

在PHP中實現自定義會話處理可以通過實現SessionHandlerInterface接口來完成。具體步驟包括:1)創建實現SessionHandlerInterface的類,如CustomSessionHandler;2)重寫接口中的方法(如open,close,read,write,destroy,gc)來定義會話數據的生命週期和存儲方式;3)在PHP腳本中註冊自定義會話處理器並啟動會話。這樣可以將數據存儲在MySQL、Redis等介質中,提升性能、安全性和可擴展性。

SessionID是網絡應用程序中用來跟踪用戶會話狀態的機制。 1.它是一個隨機生成的字符串,用於在用戶與服務器之間的多次交互中保持用戶的身份信息。 2.服務器生成並通過cookie或URL參數發送給客戶端,幫助在用戶的多次請求中識別和關聯這些請求。 3.生成通常使用隨機算法保證唯一性和不可預測性。 4.在實際開發中,可以使用內存數據庫如Redis來存儲session數據,提升性能和安全性。

在無狀態環境如API中管理會話可以通過使用JWT或cookies來實現。 1.JWT適合無狀態和可擴展性,但大數據時體積大。 2.Cookies更傳統且易實現,但需謹慎配置以確保安全性。


熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

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

熱門文章

熱工具

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。

Atom編輯器mac版下載
最受歡迎的的開源編輯器