Time of Update: 2017-02-15
因為Yii測試架構基於PHPUnit構建,所以推薦你在理解如何寫一個單元測試之前先通讀一遍PHPUnit文檔。下面我們簡要概括一下在Yii中寫一個單元測試的基本原則:一個單元測試以繼承自CTestCase或者CDbTestCase的XyzTest類的形式編寫, 其中Xyz代表要被測試的類. 例如, 想要測試Post類,我們會相應地將測試類別命名為PostTest. 基類CTestCase是通用單元測試類, 而CDbTestCase只適用於測試AR模型類. 由於PHPUnit_Framework_
Time of Update: 2017-02-15
自動化的測試需要被執行很多次.為了確保測試過程是可以重複的, 我們很想要在一些可知的狀態下進行測試, 這個狀態我們稱之為 特定狀態. 舉個例子,在一個部落格應用中測試文章建立特性, 每次當我們進行測試時, 與文章相關的表(例如. Post 表 , Comment 表)應該被恢複到一個特定的狀態下. PHPUnit 文檔 已經很好的描述了一般的特定狀態的構建. 而本節主要介紹怎樣像剛才描述的例子那樣構建資料庫特定狀態.設定構建資料庫的特定狀態,這恐怕是測試以資料庫為後端支援的應用最耗時的部分之一.
Time of Update: 2017-02-15
測試是軟體開發中必不可少的環節.無論我們是否意識到,在開發Web應用的時候,我們始終都是在測試的.例如, 當我們用PHP寫了一個類時, 我們可能會用到一些注入 echo 或者 die 語句來顯示我們是否正確地實現了某個方法;當我們實現了包含一套複雜的HTML表單的web頁面時, 我們可能會試著輸入一些測試資料來確認頁面是否是按照我們的預期來互動的.更進階的開發人員則會寫一些代碼來自動完成這個測試過程, 這樣一來每當我們需要測試一些東西的時候, 我們只需要調用代碼, 剩下來的就交給電腦了.
Time of Update: 2017-02-15
Yii是精心設計,使第三方庫可易於整合,進一步擴大Yii的功能。 當在一個項目中使用第三方庫,程式員往往遇到關於類命名和檔案包含的問題。 因為所有Yii類以C字母開頭,這就減少可能會出現的類命名問題;而且因為Yii依賴SPL autoload執行類檔案包含,如果他們使用相同的自動載入功能或PHP包含路徑包含類檔案,它可以很好地結合。下面我們用一個例子來說明如何在一個Yii application從Zend
Time of Update: 2017-02-15
由於擴充意味著是第三方開發人員使用,需要一些額外的努力去建立它。以下是一些一般性的指導原則:*擴充最好是自己自足。也就是說,其外部的依賴應是最少的。如果使用者的擴充需要安裝額外的軟體包,類或資源檔案,這將是一個頭疼的問題。 *檔案屬於同一個擴充的,應組織在同一目錄下,目錄名用副檔名稱。 *擴充裡面的類應使用一些單詞字母首碼,以避免與其他擴充命名衝突。 *擴充應該提供詳細的安裝和API文檔。這將減少其他開發員使用擴充時花費的時間和精力。
Time of Update: 2017-02-15
在開發中擴充Yii是一個很常見的行為.例如,當你寫一個新的控制器時,你通過繼承 CController 類擴充了 Yii;當你編寫一個新的組件時,你正在繼承 CWidget 或者一個已存在的組件類.如果擴充代碼是由第三方開發人員為了複用而設計的,我們則稱之為 extension(擴充).一個擴充通常是為了一個單一的目的服務的.在 Yii 中,他可以按照如下分類:應用的組件組件控制器動作過濾器控制台命令校正器: 校正器是一個繼承自 CValidator 類的組件.輔助器:
Time of Update: 2017-02-15
當使用fragment caching或page caching,我們常常遇到的這樣的情況 整個部分的輸出除了個別地方都是靜態。例如,協助頁可能會顯示靜態協助 資訊,而使用者名稱稱顯示的是目前使用者的。解決這個問題,我們可以根據使用者名稱匹配緩衝內容,但是這將是我們寶貴空間一個巨大的浪費,因為緩衝除了使用者名稱其他大部分內容是相同的。我們還可以把網頁切成幾個片段並分別緩衝,但這種情況會使頁面和代碼變得非常複雜。更好的方法是使用由[ CController ]提供的動態內容dynamic
Time of Update: 2017-02-15
頁面緩衝指的是緩衝整個頁面的內容。頁面緩衝可以發生在不同的地方。 例如,通過選擇適當的頁面頭,用戶端的瀏覽器可能會緩衝網頁瀏覽有限時間。 Web應用程式本身也可以在緩衝中儲存網頁內容。 在本節中,我們側重於後一種辦法。頁面緩衝可以被看作是 片段快取一個特殊情況 。 由於網頁內容是往往通過應用布局來產生,如果我們只是簡單的在布局中調用beginCache() 和endCache(),將無法正常工作。
Time of Update: 2017-02-15
片段快取指緩衝網頁某片段。例如,如果一個頁面在表中顯示每年的銷售摘要,我們可以儲存此表在緩衝中,減少每次請求需要重新產生的時間。要使用片段快取,在控制器視圖指令碼中調用CController::beginCache() 和CController::endCache() 。這兩種方法開始和結束包括的頁面內容將被緩衝。類似data caching ,我們需要一個編號,識別被緩衝的片段。...別的HTML內容...<?php if($this->beginCache($id)) {
Time of Update: 2017-02-15
資料緩衝即儲存一些 PHP 變數到緩衝中,以後再從緩衝中取出來。出於此目的,緩衝組件的基類 CCache 提供了兩個最常用的方法: set() 和 get()。要在緩衝中儲存一個變數 $value ,我們選擇一個唯一 ID 並調用 set() 儲存它:Yii::app()->cache->set($id, $value);緩衝的資料將一直留在緩衝中,除非它由於某些緩衝策略(例如緩衝空間已滿,舊的資料被刪除)而被清除。 要改變這種行為,我們可以在調用 set()
Time of Update: 2017-02-15
緩衝是提升Web應用效能的簡便有效方式。通過將相對靜態資料存放區到緩衝並在收到請求時取回緩衝,我們便節省了產生這些資料所需的時間。在 Yii 中使用緩衝主要包括配置並訪問一個應用組件。 下面的應用配置設定了一個使用兩個 memcache 快取服務器的緩衝組件。array( ...... 'components'=>array( ...... 'cache'=>array(
Time of Update: 2017-02-15
注意: yii從版本1.1.6以後才開始支援資料庫遷移特性。和源碼一樣,資料庫的結構也隨著我們開發和維護資料庫驅動應用而不斷壯大.例如,在開發期間,我們可能想要添加一個新的表; 或者在應用投入生產期以後,我們可能會意識到需要在某個列上添加索引.
Time of Update: 2017-02-15
我們已經瞭解了怎樣使用 Active Record (AR) 從單個資料表中擷取資料。 在本節中,我們講解怎樣使用 AR 串連多個相關資料表並取回關聯(join)後的資料集。為了使用關係型 AR,我們建議在需要關聯的表中定義主鍵-外鍵約束。這些約束可以協助保證相關資料的一致性和完整性。為簡單起見,我們使用如下所示的實體-關係(ER)圖中的資料結構示範此節中的例子。資訊: 對外鍵約束的支援在不同的 DBMS 中是不一樣的。 SQLite < 3.6.19
Time of Update: 2017-02-15
雖然 Yii DAO 可以處理幾乎任何資料庫相關的任務, 但很可能我們會花費 90% 的時間以編寫一些執行普通 CRUD(create, read, update 和 delete)操作的 SQL 陳述式。 而且我們的代碼中混雜了SQL語句時也會變得難以維護。要解決這些問題,我們可以使用 Active Record。Active Record (AR) 是一個流行的 對象-關係映射 (ORM) 技術。 每個 AR 類代表一個資料表(或視圖),資料表(或視圖)的列在 AR
Time of Update: 2017-02-13
Data Access Objects(DAO) 對訪問儲存在不同資料庫管理系統(DBMS)中的資料提供了一個通用的API。 因此,在將底層 DBMS 更換為另一個時,無需修改使用了 DAO 訪問資料的代碼。 Yii DAO 基於 PHP Data Objects (PDO) 構建。它是一個為眾多流行的DBMS提供統一資料訪問的擴充,這些 DBMS 包括 MySQL, PostgreSQL 等等。因此,要使用 Yii DAO,PDO 擴充和特定的 PDO 資料庫驅動(例如 PDO_MYSQL)
Time of Update: 2017-02-13
Yii提供了強大的資料庫編程支援。YiiData Access Objects(DAO)建立在PHP的資料對象(PDO)extension上,使得在一個單一的統一的介面可以訪問不同的資料庫管理系統(DBMS)。使用Yii的DAO開發的應用程式可以很容易地切換使用不同的資料庫管理系統,而不需要修改資料存取碼。Yii 的Active Record( AR ),實現了被廣泛採用的對象關係映射(ORM)辦法,進一步簡化資料庫編程。按照約定,一個類代表一個表,一個執行個體代表一行資料。Yii
Time of Update: 2017-02-13
當建立 HTML 表單時,經常我們發現我們在寫很多重複而且在不同項目中很難重用的視圖代碼。 例如,對於每個輸入框, 我們需要以一個文字標籤和顯示可能的驗證錯誤來關聯它。 為了改善這些代碼的重用性,我們可以使用自版本 1.1.0 可用的表單產生器特徵。1. 基本概念Yii 表單產生器使用 CForm 對象來代表描述一個HTML表單所需的內容,包括哪些資料模型關聯到此表單, 表單中有哪些輸入框,以及如何渲染整個表單。開發人員主要需要建立和配置這個 CForm
Time of Update: 2017-02-13
有時我們想通過批量模式收集使用者輸入。也就是說, 使用者可以為多個模型執行個體輸入資訊並將它們一次性提交。 我們將此稱為 表格輸入(tabular input) ,因為這些輸入項通常以 HTML 表格的形式呈現。要使用表格輸入,我們首先需要建立或填充一個模型執行個體數組,取決於我們是想插入還是更新資料。 然後我們從 $_POST 變數中提取使用者輸入的資料並將其賦值到每個模型。和單模型輸入稍有不同的一點就是: 我們要使用 $_POST['ModelClass'][$i]
Time of Update: 2017-02-13
編寫 login 視圖是很簡單的,我們以一個 form 標記開始,它的 action 屬性應該是前面講述的 login 動作的URL。 然後我們需要為 LoginForm 類中聲明的屬性插入標籤和表單域。最後, 我們插入一個可由使用者點擊提交此表單的提交按鈕。所有這些都可以用純HTML程式碼完成。Yii 提供了幾個助手(helper)類簡化視圖編寫。例如, 要建立一個文本輸入欄位,我們可以調用 CHtml::textField(); 要建立一個下拉式清單,則調用
Time of Update: 2017-02-13
有了模型,我們就可以開始編寫用於操作此模型的邏輯了。 我們將此邏輯放在一個控制器的動作中。對登入表單的例子來講,相應的代碼就是:public function actionLogin(){ $model=new LoginForm; if(isset($_POST['LoginForm'])) { // 收集使用者輸入的資料 $model->attributes=$_POST['LoginForm'];