生成器
在這一章節,我們將看看命名爲tspawn的生成器命令.
生成應用程序框架
首選, 在我們做其他事情前需要創建一個應用程序的框架.我們將再次使用blogapp創建.從命令行輸入下面的命令(在Windows上,從Treefrog命令行窗口執行)
$ tspawn new blogapp
當你執行完這條命令, 應用名將作爲目錄樹的根目錄.配置文件(ini)和項目文件(pro)也會生成.目錄是你已經看過的一些名字.
下面的項目將作爲一個文件夾生成.
- controllers
- models
- views
- heplers
- config -配置文件
- db - 數據庫存儲文件 (SQLite)
- lib
- log -記錄文件
- plugin
- public -靜態HTML文件, 圖片,JavaScript 文件
- script
- test
- tmp -臨時目錄,例如上傳的文件
生成骨架
骨架包括CURD操作的基本實現.骨架包含以下部件:控制器(controller),模型(model),視圖(view)源代碼的源代碼, 還有項目文件(pro).因此, 這些骨架構成了一個好的基礎幫助你完成一個完整的開發.爲了用生成器命令tspawn生成一個骨架, 需要先在數據庫定義一個表, 然後在配置文件(database.ini)中設置數據庫信息.
現在, 開始定義一張表.見下面的例子:> CREATE TABLE blog (id INTEGER PRIMARY KEY, title VARCHAR(20), body VARCHAR(200));
如果想使用SQLite作爲數據庫, 你應該把數據庫文件放在應用程序的根目錄內.你可以在配置文件中設置數據庫信息.生成器命令使用在dev節設置的信息.
[dev] driverType=QMYSQL databaseName=blogdb hostName= port= userName=root password=root connectOptions=
設置清單
項目 | 含義 | 說明 |
---|---|---|
driverType | 驅動名稱 | 有以下選項: - QDB2: IBM DB2 - QIBASE: Borland InterBase Driver - QMYSQL: MySQL Driver - QOCI: Oracle Call Interface Driver - QODBC: ODBC Driver - QPSQL: PostgreSQL Driver - QSQLITE: SQLite version 3 or above |
databaseName | 數據庫名稱 | 如果是SQLite必須定義文件路徑. 如:db/blogdb |
hostName | 主機名稱 | 留空表示localhost |
port | 端口 | 留空表示默認端口 |
userName | 用戶名 | |
password | 密碼 | |
connectOptions | 連接選項 | 更多信息參看Qt文檔: QSqlDatabase::setConnectOptions() |
如果Qt SDK沒有提供數據庫驅動將不能訪問數據庫.如果沒有還沒有構建,你必須設置好驅動.作爲替代, 你可以從下載頁下載數據庫驅動,然後安裝它.當你執行完生成器命令(完成上面提到的步驟), 骨架就會生成.每條命令都應該在應用程序的根目錄下執行.
$ cd blogapp
$ tspawn scaffold blog
driverType: QMYSQL
databaseName: blogdb
hostName:
Database open successfully
created controllers/blogcontroller.h
created controllers/blogcontroller.cpp
:
簡單地說:在數據庫中定義好表結構, 然後使用生成器生成骨架.
模型名稱(Model-Name)/控制器名稱(Controller-Name)和表名(Table Name)的關係
生成器會基於表名生產類的名字.規則如下:
銆€Table name Model name Controller name Sql object name
銆€blog_entry 鈫? BlogEntry BlogEntryController BlogEntryObject
請注意下劃線會被刪掉,後面的第一個字母會改成大寫的.可以完全忽略單詞單數和複數形式直接區別.
生成器子命令
這裏是tspawn命令的用法規則:
$ tspawn -h
usage: tspawn <subcommand> [args]
Available subcommands:
new (n) <application-name>
scaffold (s) <model-name>
controller (c) <controller-name>
model (m) <table-name>
sqlobject (o) <table-name>
如果你使用”controller”,”model”,”sqlobject”作爲子命令, 將只會生成”controller”, “model” 和 “SqlObject”.
列
Treefrog沒有升級數據庫的功能或者更改管理數據庫表結構的機制.基於以下原因,我認爲它是不重要的:
- 如果我實現升級功能, 用戶會有額外的學習成本.
- 這些是關於DB操作的完整功能的SQL 知識.
- 在Treefrog, 可以在表更改後重新生成ORM對象類.(不幸, 可能也會影響到Model類)
- 我認爲對SQL命令進行框架差異管理是沒有什麼價值的。你是否同意這些觀點?
名稱轉換
Treefrog 有類名和文件名轉換功能.生成器按照下面的條款和規定生成類名和文件名.
控制器名稱的轉換
控制器類名是”表名+Controller”控制器的類名永遠使用大寫字母打頭, 不要使用下劃線分隔單詞,而是將下劃線後的單詞首個字母換成大寫的.
以下類名是很好的例子幫助理解如何轉換.
- BlogController
- EntryCommentController這些文件保存在controller文件夾內.文件夾內的文件名是全部小寫的, 類名加上對應的擴展名(.cpp 或 .h).
模型名稱的轉換
和控制器的方式一樣, 模型名稱永遠使用大寫字母打頭, 不要使用下劃線分隔單詞,而是將下劃線後的單詞首個字母換成大寫的.例如下面的類名:
- Blog
- EntryComment這些文件保存在models文件夾內.和控制器一樣, 這些文件名全部是小寫的.模型名後加上文件擴展(.cpp 或 .h).和Rails不同, 我們不使用單詞單數和複數形式的轉換.
視圖名稱的轉換
模版文件按照”控制器名稱+擴展名”的文件名形式生成,文件名全部是小寫的, 在”views/控制器名”目錄內.擴展名取決於選擇的模版系統.同時, 但你構建視圖然後輸出源文件在”views/_src”文件內.你會注意到這些文件已經全部轉換成了C++ 代碼模版.當文件編譯後, 會生成一個view的共享庫.
CRUD
CRUD包括了網頁應用的四個主要功能.這個名稱來自於四個單詞的首字符”新建(Create)”,”讀取(Read)”,”更新(Update)”,和”刪除(Delete)”.當你新建一個骨架, 生成器命令生成如下名稱的代碼:
CURD對應表
Action | Model | ORM | SQL | |
---|---|---|---|---|
C | create | create() [static] create() |
create() | INSERT |
R | index show |
get() [static] getAll() [static] |
find() | SELECT |
U | save | save() update() |
update() | UPDATE |
D | remove | remove() | remove() | DELETE |
關於 T_CONTROLLER_EXPORT宏
生成器生成的控制器類將會增加到宏T_CONTROLLER_EXPORT.在Windows上, 控制器是一個單獨的DLL文件, 但是爲了在DLL外可使用這些類和功能, 我們需要使用關鍵字__declspec (稱爲dllexport)定義它.T_CONTROLLER_EXPORT宏會用這個關鍵字完成替換.
然而, 在Linux和Mac OS X下安裝,T_CONTROLLER_EXPORT沒有定義任何內容, 因爲關鍵字__declspec是不需要的.
#define T_CONTROLLER_EXPORT
通過這種方式, 同樣的代碼就能夠支持多平臺了.