1. 使用 Gii
Gii 是以模塊的方式實現的,它必須在一個已存在的 Yii 應用程序中使用。要使用 Gii,我們首先更改應用程序的配置如下:
return array(
......
'modules'=>array(
'gii'=>array(
'class'=>'system.gii.GiiModule',
'password'=>'在這裡填寫密碼',
// 'ipFilters'=>array(...IP 列表...),
// 'newFileMode'=>0666,
// 'newDirMode'=>0777,
),
),
);
在上面,我們聲明了一個名為 gii的模塊,它的類是 GiiModule。我們也為這個模塊設置了一個密碼,我們訪問 Gii 時會有一個輸入框要求填寫這個密碼。
出於安全考慮,默認情況下只允許本機訪問 Gii。若允許其他可信賴的機器訪問它,我們需要如上所示配置 GiiModule::ipFilters屬性。
因為 Gii 會生成並保存新文件到應用程序中,我們需要確保 Web 服務器進程有權限這樣做。上面的 GiiModule::newFileMode和 GiiModule::newDirMode屬性控制如何生成新文件和新目錄。
注意:Gii 主要用作一個開發工具。因此,應當只在開發機器上安裝它。因為它可以在應用程序中生成新的 PHP 文件,我們應當對安全問題足夠重視(例如設置密碼,IP 過濾)。
現在可以通過 URL http://hostname/path/to/index.php?r=gii訪問 Gii 了。這裡我們假設 http://hostname/path/to/index.php是訪問 Yii 應用程序的 URL。
若 Yii 應用程序使用 path格式的 URL (查看 URL management),我們可以通過 URL http://hostname/path/to/index.php/gii訪問 Gii。 我們可能需要增加如下 URL 規則到已有的 URL 規則的前面:
'components'=>array(
......
'urlManager'=>array(
'urlFormat'=>'path',
'rules'=>array(
'gii'=>'gii',
'gii/<controller:\w+>'=>'gii/<controller>',
'gii/<controller:\w+>/<action:\w+>'=>'gii/<controller>/<action>',
...已有的規則...
),
),
)
Gii 有一些默認的代碼生成器。每個代碼生成器負責生成特定類型的代碼。例如 controller 生成器生成一個 controller 類以及一些 action view 腳本; model 生成器為指定的數據表生成一個 ActiveRecord 類。
使用一個生成器的基本流程如下:
進入生成器頁面;
填寫指定代碼生成參數的輸入框。例如,使用 Module Generator 創建一個新模塊,你需要指定 module ID;
點擊 Preview按鈕預覽即將生成的代碼。你將看到一個表格中列出了將要生成的文件列表。你可以點擊其中任何一個文件來預覽代碼;
點擊 Generate按鈕生成這些代碼文件;
查看代碼生成日志。
2. 擴展 Gii
雖然默認的 Gii 代碼生成器可以生成非常強大的代碼,然而我們經常想定制它們或者創建一個新的來適應我們的口味和需求。例如,我們想讓生成的代碼是我們喜歡的風格,或者想讓代碼支持多種語言。所有這些在 Gii 中都可非常容易地實現。
可以 2 種方式擴展 Gii:定制已存在的代碼生成器的代碼模板,以及編寫新的代碼生成器。
代碼生成器的架構
一個代碼生成器存儲在一個目錄中,這個目錄的名字被認為是生成器的名字。目錄通常由如下內容組成:
model/ the model generator root folder
ModelCode.php the code model used to generate code
ModelGenerator.php the code generation controller
views/ containing view scripts for the generator
index.php the default view script
templates/ containing code template sets
default/ the 'default' code template set
model.php the code template for generating model class code
生成器搜索路徑
Gii 在GiiModule::generatorPaths屬性指定的目錄中查找可用的生成器。 當需要定制時,我們可以在應用程序的配置文件中做如下配置,
return array(
'modules'=>array(
'gii'=>array(
'class'=>'system.gii.GiiModule',
'generatorPaths'=>array(
'application.gii', // a path alias
),
),
),
);
上面的配置告訴 Gii 在別名是 application.gii的目錄中尋找生成器,以及默認的位置 system.gii.generators。
在不同的搜索路徑有同名的生成器也是可以的。這種情況下,在 GiiModule::generatorPaths指定目錄中先出現的生成器有優先權。
定制代碼模板
這是擴展 Gii 最容易最常用的方式。我們使用一個例子來介紹如何定制代碼模板。假設我們想要定制由 model 生成器生成的代碼。
我們首先創建一個名為 protected/gii/model/templates/compact的目錄。這裡的 model意味著我們將要 override默認的 model 生成器。 templates/compact意味著我們將增加一個新的代碼模板集名為 compact。
然後我們在應用程序配置裡把 application.gii增加到 GiiModule::generatorPaths。如上所示。
現在打開 model 代碼生成器頁面。點擊 Code Template輸入框。我們應當看到一個下拉列表,這個列表包含了我們新建的模板目錄 compact。可是,若我們選擇此模板生成代碼,我們將看到錯誤。這是因為我們還沒有在新的 compact模板集中放入任何實際的代碼模板文件。
復制文件 framework/gii/generators/model/templates/default/model.php到 protected/gii/model/templates/compact。若我們再次嘗試以 compact模板生成,我們會成功。但是,生成的代碼和以 default模板集生成的代碼沒什麼不同。
現在是時候做點真正的工作了。打開文件 protected/gii/model/templates/compact/model.php以編輯它。記得這個文件將作為類似一個視圖文件被使用,意味著它可以包含 PHP 表達式和語句。讓我們更改模板以便生成的代碼裡 attributeLabels()方法使用 Yii::t()來翻譯屬性標簽:
public function attributeLabels()
{
return array(
<?php foreach($labels as $name=>$label): ?>