# 腳本命令的使用
自動化是提升開發效率的一個有效途徑。PhalApi致力于簡單的接口服務開發,同時也致力于通過自動化提升項目的開發速度。為此,生成單元測試骨架代碼、生成數據庫建表SQL這些腳本命令。應用這些腳本命令,能快速完成重復但消耗時間的工作。下面將分別進行說明。
## phalapi-buildtest命令
當需要對某個類進行單元測試時,可使用phalapi-buildtest命令生成對應的單元測試骨架代碼,其使用說明如下:

其中,
+ **第一個參數file_path** 是待測試的源文件相對/絕對路徑 。
+ **第二個參數class_name** 是待測試的類名。
+ **第三個參數bootstrap** 是測試啟動文件,通常是/path/to/phalapi/tests/bootstrap.php文件。
+ **第四個參數author** 你的名字,默認是dogstar。
通常,可以先寫好類名以及相應的接口,然后再使用此腳本生成單元測試骨架代碼。以默認接口服務```Site.Index```接口服務為例,當需要為其生成單元測試骨架代碼時,可以執行以下命令。
```bash
$ ./bin/phalapi-buildtest ./src/app/Api/Site.php App\\Api\\Site > ./tests/app/Api/Site_Test.php
```
最后,需要將生成好的骨架代碼,重定向保存到你要保存的位置。通常與產品代碼對齊,并以“{類名} + _Test.php”方式命名,如這里的app/Api/Site_Test.php。
生成的骨架代碼類似如下:
```php
<?php
//require_once dirname(__FILE__) . '/bootstrap.php';
if (!class_exists('App\\Api\\Site')) {
require dirname(__FILE__) . '/./src/app/Api/Site.php';
}
/**
* PhpUnderControl_App\Api\Site_Test
*
* 針對 ./src/app/Api/Site.php App\Api\Site 類的PHPUnit單元測試
*
* @author: dogstar 20170725
*/
class PhpUnderControl_AppApiSite_Test extends \PHPUnit_Framework_TestCase
{
public $appApiSite;
protected function setUp()
{
parent::setUp();
$this->appApiSite = new App\Api\Site();
}
... ...
```
簡單修改后,便可運行。
## phalapi-buildsqls命令
當需要創建數據庫表時,可以使用phalapi-buildsqls腳本命令,再結合數據庫配置文件./config/dbs.php即可生成建表SQL語句。此命令在創建分表時尤其有用,其使用如下:

其中,
+ **第一個參數dbs_config** 是指向數據庫配置文件的路徑,如./Config/dbs.php,可以使用相對路徑。
+ **第二個參數table** 是需要創建sql的表名,每次生成只支持一個。
+ **第三個參數engine** 可選參數,是指數據庫表的引擎,MySQL可以是:Innodb或者MyISAM。
+ **第四個參數sqls_folder** 可選參數,SQL文件的目錄路徑。
在執行此命令先,需要提前先將建表的SQL語句,排除除主鍵id和ext_data字段,放置到./data目錄下,文件名為:{表名}.sql。
例如,我們需要生成10張user_session用戶會話分表的建表語句,那么需要先添加數據文件./data/user_session.sql,并將除主鍵id和ext_data字段外的其他建表語句保存到該文件。
```sql
`user_id` bigint(20) DEFAULT '0' COMMENT '用戶id',
`token` varchar(64) DEFAULT '' COMMENT '登錄token',
`client` varchar(32) DEFAULT '' COMMENT '客戶端來源',
`times` int(6) DEFAULT '0' COMMENT '登錄次數',
`login_time` int(11) DEFAULT '0' COMMENT '登錄時間',
`expires_time` int(11) DEFAULT '0' COMMENT '過期時間',
```
然后,進入到項目根目錄,執行命令:
```bash
$ php ./bin/phalapi-buildsqls ./config/dbs.php user_session
```
正常情況下,會看到生成好的SQL語句,類似下面這樣的輸出。
```sql
CREATE TABLE `phalapi_user_session_0` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`user_id` bigint(20) DEFAULT '0' COMMENT '用戶id',
`token` varchar(64) DEFAULT '' COMMENT '登錄token',
`client` varchar(32) DEFAULT '' COMMENT '客戶端來源',
`times` int(6) DEFAULT '0' COMMENT '登錄次數',
`login_time` int(11) DEFAULT '0' COMMENT '登錄時間',
`expires_time` int(11) DEFAULT '0' COMMENT '過期時間',
`ext_data` text COMMENT 'json data here',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `phalapi_user_session_1` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
... ...
`ext_data` text COMMENT 'json data here',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `phalapi_user_session_2` ... ...
CREATE TABLE `phalapi_user_session_3` ... ...
CREATE TABLE `phalapi_user_session_4` ... ...
CREATE TABLE `phalapi_user_session_5` ... ...
CREATE TABLE `phalapi_user_session_6` ... ...
CREATE TABLE `phalapi_user_session_7` ... ...
CREATE TABLE `phalapi_user_session_8` ... ...
CREATE TABLE `phalapi_user_session_9` ... ...
```
最后,便可把生成好的SQL語句,導入到數據庫,完成建表的操作。
值得注意的是,生成的SQL建表語句默認會帶有自增ID主鍵id和擴展字段ext_data這兩個字段。所以保存在./data目錄下的建表語句可省略主鍵字段,以免重復。
```sql
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
... ...
`ext_data` text COMMENT 'json data here',
```
## 注意事項
在使用這些腳本命令前,需要注意以下幾點。
### 執行權限
第一點是執行權限,當未設置執行權限時,腳本命令會提示無執行權限,類似這樣。
```bash
$ ./phalapi/bin/phalapi-buildtest
-bash: ./phalapi/bin/phalapi-buildtest: Permission denied
```
那么需要這樣設置腳本命令的執行權限。
```bash
$ chmod +x ./phalapi/bin/phalapi-build*
```
### 編碼問題
其次,對于Linux平臺,可能會存在編碼問題,例如提示:
```bash
$ ./phalapi/bin/phalapi-buildtest
bash: ./phalapi/bin/phalapi-buildtest: /bin/bash^M: bad interpreter: No such file or directory
```
這時,可使用dos2unix命令轉換一下編碼。
```bash
$ dos2unix ./phalapi/bin/phalapi-buildtest*
dos2unix: converting file ./phalapi/bin/phalapi-buildsqls to Unix format ...
dos2unix: converting file ./phalapi/bin/phalapi-buildtest to Unix format ...
```
### 軟鏈
最后一點是,在任意目錄位置都是可以使用這些命令的,但會與所在的項目目錄綁定。通常,為了更方便使用這些命令,可以將這些命令軟鏈到系統命令下。例如:
```bash
$ sudo ln -s /path/to/phalapi/bin/phalapi-buildsqls /usr/bin/phalapi-buildsqls
$ sudo ln -s /path/to/phalapi/bin/phalapi-buildtest /usr/bin/phalapi-buildtest
```