CodeSmith 使用教程(3): 自动生成Yii Framework ActiveRecord
来源:互联网 发布:英雄杀换区符清除数据 编辑:程序博客网 时间:2024/05/19 22:02
上例介绍了使用CodeSmith编写代码模板的基本方法,本例实现一个较为实用的代码模板,通过数据库自动为Yii Framework生成所需要的ActiveRecord 类。
本例通过修改Yii Framework 开发教程(26) 数据库-Active Record示例 ,原例是手工编写Employee.php ActiveRecord。
首先为工程添加一个C#项目(任意类型,我们只是利用这个项目来包含CodeSmith项目),然后添加一个CodeSmith项目和一个CodeSmith模板。然后参考CodeSmith 使用教程(1): 概述 使用Schema Explorer 添加一个数据连接,本例连接到Chinook数据库:
创建的代码模板 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" %><?phpclass <%= 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>
使用主从模板的具体用法后面再介绍,简单的说子模板相当于子函数,主模板类似于主函数可以调用子函数,主模板通过调用子模板,传给子模板属性从而可以生成多个文件。
创建一个代码模板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" %><script runat="template">public string FirstLetterToUpper(string str){ if (str != null) { if(str.Length > 1) return char.ToUpper(str[0]) + str.Substring(1); else return str.ToUpper(); } return str;}</script><% 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>();%> <% 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:\tmp\ActiveRecordDemo\ActiveRecordDemo\protected\models\Album.php Generated: D:\tmp\ActiveRecordDemo\ActiveRecordDemo\protected\models\Artist.php Generated: D:\tmp\ActiveRecordDemo\ActiveRecordDemo\protected\models\Customer.php Generated: D:\tmp\ActiveRecordDemo\ActiveRecordDemo\protected\models\Employee.php Generated: D:\tmp\ActiveRecordDemo\ActiveRecordDemo\protected\models\Genre.php Generated: D:\tmp\ActiveRecordDemo\ActiveRecordDemo\protected\models\Invoice.php Generated: D:\tmp\ActiveRecordDemo\ActiveRecordDemo\protected\models\Invoiceline.php Generated: D:\tmp\ActiveRecordDemo\ActiveRecordDemo\protected\models\Mediatype.php Generated: D:\tmp\ActiveRecordDemo\ActiveRecordDemo\protected\models\Playlist.php Generated: D:\tmp\ActiveRecordDemo\ActiveRecordDemo\protected\models\Playlisttrack.php Generated: D:\tmp\ActiveRecordDemo\ActiveRecordDemo\protected\models\Track.php Generated: D:\tmp\ActiveRecordDemo\CodeSmith\YiiDataModel.txtDone rendering outputs: 1 succeeded, 0 failed, 0 skipped (1111ms).
刷新项目可以看到自动生成的代码文件
本例只是为每个数据表生成最简单的ActiveRecord,如果需要生成关联ActiveRecord,可以进一步根据表之间的关系为每个ActiveRecord 生成所需的relations 方法,后面有时间进一步介绍。
本例下载
- CodeSmith 使用教程(3): 自动生成Yii Framework ActiveRecord
- CodeSmith 使用教程(3): 自动生成Yii Framework ActiveRecord
- CodeSmith 使用教程(15) 为Yii Framework 创建生成ActiveRecord的代码模板
- CodeSmith 使用教程(15) 为Yii Framework 创建生成ActiveRecord的代码模板
- 如何使用CodeSmith自动生成C#代码
- CodeSmith自动生成代码
- codesmith 自动生成nhibernate
- Yii Framework 开发教程(8) 使用FormModel
- Yii Framework 开发教程(8) 使用FormModel
- YII Framework学习教程-YII的缓存-使用
- CodeSmith自动生成的Dao文件使用的字符串
- 使用CodeSmith 生成代码
- codeSmith的使用教程
- CodeSmith使用教程
- CodeSmith 使用教程: 总结
- CodeSmith 使用教程: 总结
- Yii框架中ActiveRecord使用Relations
- Yii Framework 开发教程(7) 使用CHtml 创建Form
- 在O(1)时间删除链表一个结点
- HEVC学习(二十三) —— 熵编码之四
- 新浪 app 开发实战(Flex+Asp.net)
- android地图导航1-------基本准备
- 2012移动开发教程盘点:最棒的国外游戏开发站
- CodeSmith 使用教程(3): 自动生成Yii Framework ActiveRecord
- WebService框架整理(一) Axis1
- java 调用mysql的存储过程(简单示例)
- 分组加密的四种模式
- 设置手机系统locale
- ext grid 的每行最后一列添加 按钮
- 智能计算综述1
- 10年+程序人生感悟
- 遗传算法资料