實戰範例:透過 CodeSmith 連接資料庫,自動為 Yii Framework 產生所有資料表對應的 ActiveRecord PHP 類別。

<%@ Template Language="C#" TargetLanguage="PHP" Debug="False" %>
<%@ Property Name="TableName" Type="System.String" Description="Table name" %>
<?php
class <%= TableName %> extends CActiveRecord {
public static function model($className=__CLASS__) {
return parent::model($className);
}
public function tableName() {
return '<%= TableName %>';
}
}
?>
<script runat="template">
public override string GetFileName() {
return TableName + ".php";
}
</script>
<%@ CodeTemplate Language="C#" TargetLanguage="Text" %>
<%@ Register Name="ActiveRecord" Template="PhpActiveRecord.cst" MergeProperties="false" %>
<%@ Property Name="SourceDatabase" Type="SchemaExplorer.DatabaseSchema" %>
<%@ Assembly Name="SchemaExplorer" %>
<%@ Import Namespace="SchemaExplorer" %>
<script runat="template">
public string FirstLetterToUpper(string str) {
if (str != null && str.Length > 1)
return char.ToUpper(str[0]) + str.Substring(1);
return str?.ToUpper();
}
</script>
<% for (int i = 0; i < SourceDatabase.Tables.Count; i++) { %>
<% string name = FirstLetterToUpper(SourceDatabase.Tables[i].Name); %>
<% string filename = @"../ActiveRecordDemo/protected/models/" + name + ".php"; %>
<% ActiveRecord ar = this.Create<ActiveRecord>(); %>
<% ar.TableName = name; %>
<% ar.RenderToFile(filename, true); %>
<% } %>
Register 指令註冊子範本,Create<T>() 實例化RenderToFile() 直接輸出至指定路徑SourceDatabase.Tables 批次產生FirstLetterToUpper 處理類別命名慣例