×
CodeSmith 概述编写第一个代码模板自动生成 Yii ActiveRecord 模板基本语法-CodeTemplate 指令基本语法-使用注释基本语法-声明和使用属性基本语法-转义 Asp.Net 标记CodeTemplate 对象Progress 对象CodeTemplateInfo 对象引用其它文件或 .Net 类库CodeSmith 使用主从代码模板CodeSmith 调试SchemaExplorer 来获取DB定义为 Yii 创建 ActiveRecord 模板CodeSmith 使用 XMLPropertyCodeSmith Merge 策略

CodeSmith 自动生成 Yii Framework ActiveRecord 类简单模板


上例介绍了使用 CodeSmith 编写代码模板的基本方法,本例实现一个较为实用的代码模板,通过数据库自动为 Yii Framework 生成所需要的 ActiveRecord 类。

首先为工程添加一个 C# 项目(任意类型,我们只是利用这个项目来包含 CodeSmith 项目),然后添加一个 CodeSmith 项目和一个 CodeSmith 模板。然后参考 CodeSmith 使用教程(1): 概述 使用Schema Explorer 添加一个数据连接,本例连接到 Chinook 数据库:

第13张

创建的代码模板 PhpActiveRecord.cst 定义个属性 TableName(数据库表名),复制 Yii Framework 开发教程(26) 数据库-Active Record 示例中 Employee.php 的定义并使用属性,代码如下:

<%@ Template Language="C#" TargetLanguage="PHP" Debug="False" %>

<%@ Property Name="TableName" Type="System.String" Description="Table name" %>

 extends CActiveRecord
{
    public static function model($className=__CLASS__)
    {
        return parent::model($className);
    }

    public function tableName()
    {
        return '<%= TableName %>';
    }
}

?>

这时就可以通过定义 TableName 的属性给任意数据表生成对应的 ActiveRecord PHP 类了。 不过这还是要手工来一个一个来配置表名。 本例通过一个主模板和一个从模板的方式通过连接数据库自动为所有的表生成对应的 ActiveRecord

使用主从模板的具体用法后面再介绍,简单的说子模板相当于子函数,主模板类似于主函数可以调用子函数,主模板通过调用子模板,传给子模板属性从而可以生成多个文件。

创建一个代码模板 YiiDataModel.cst 作为主模板,使用子模板首先需要在主模板中进行注册才能使用:

<%@ Register Name="ActiveRecord" Template="PhpActiveRecord.cst" MergeProperties="false"  %>

完整代码如下:

<%@ CodeTemplate Language="C#" TargetLanguage="Text"
  Description="List all database tables" %>
<%@ Import Namespace="System.IO" %>
<%@ Property Name="SourceDatabase" Type="SchemaExplorer.DatabaseSchema"
  Category="Context" Description="Database containing the tables." %>

<%@ Register Name="ActiveRecord" Template="PhpActiveRecord.cst"
 MergeProperties="false"  %>
<%@ Assembly Name="SchemaExplorer" %>
<%@ Import Namespace="SchemaExplorer" %>



<% for (int i = 0; i < SourceDatabase.Tables.Count; i++) { %>
   <%  string name= FirstLetterToUpper(SourceDatabase.Tables[i].Name); %>
   <%  string filename= @"../ActiveRecordDemo/protected/models/"+name+".php"; %>
     // instantiate the sub-template
    <%  ActiveRecord activeRecord = this.Create();%>
    <%  activeRecord.TableName= name; %>
    <%  activeRecord.RenderToFile(filename,true); %>
<% } %>

FirstLetterToUpper 为C#函数,主要是把数据库表名的第一个字母变为大写(纯 C# 代码)。

SchemaExplorer 为 CodeSmith 提供的数据库访问库,可以用来获取数据库 Schema 的信息,如包含的表名,字段属性,主键外键等(后面具体介绍)

在主模板中,通过 ActiveRecord 来访问子模板(名字 ActiveRecord 为注册子模板时定义) ,使用 this.create 创建子模板实例,然后传入 TableName 属性,调用 RenderToFile 将子模板的结果写道指定的文件中。

此时在 CodeSmith.csp 中添加主模板,配置数据库为 Chinook,然后生成代码

Rendering output 'YiiDataModel'...

  Generated: D:tmpActiveRecordDemoActiveRecordDemoprotectedmodelsAlbum.php
  Generated: D:tmpActiveRecordDemoActiveRecordDemoprotectedmodelsArtist.php
  Generated: D:tmpActiveRecordDemoActiveRecordDemoprotectedmodelsCustomer.php
  Generated: D:tmpActiveRecordDemoActiveRecordDemoprotectedmodelsEmployee.php
  Generated: D:tmpActiveRecordDemoActiveRecordDemoprotectedmodelsGenre.php
  Generated: D:tmpActiveRecordDemoActiveRecordDemoprotectedmodelsInvoice.php
  Generated: D:tmpActiveRecordDemoActiveRecordDemoprotectedmodelsInvoiceline.php
  Generated: D:tmpActiveRecordDemoActiveRecordDemoprotectedmodelsMediatype.php
  Generated: D:tmpActiveRecordDemoActiveRecordDemoprotectedmodelsPlaylist.php
  Generated: D:tmpActiveRecordDemoActiveRecordDemoprotectedmodelsPlaylisttrack.php
  Generated: D:tmpActiveRecordDemoActiveRecordDemoprotectedmodelsTrack.php
  Generated: D:tmpActiveRecordDemoCodeSmithYiiDataModel.txt
Done rendering outputs: 1 succeeded, 0 failed, 0 skipped (1

刷新项目可以看到自动生成的代码文件

第14张

本例只是为每个数据表生成最简单的 ActiveRecord,如果需要生成关联 ActiveRecord,可以进一步根据表之间的关系为每个 ActiveRecord 生成所需的 relations 方法,后面有时间进一步介绍。


分类导航

关注微信下载离线手册

bootwiki移动版 bootwiki
(群号:472910771)