### 目錄結構說明
* 目前,apiex主要包含了如下幾個核心文件,即apiex和apiex的traits。
* 核心功能目錄如下:
```
????????//?繼承api基類的apiex控制器
????????\\application\\common\\controller\\Apiex.php
????????//?apiex控制器的traits
????????\\application\\common\\library\\traits\\Apiex.php
????????//?apiex用戶權限類?AuthForApiex及其?對應的trait?AuthExtend
????????\\application\\common\\library\\AuthForApiex.php
????????\\application\\common\\library\\traits\\AuthExtend.php
????????//?其他擴展功能目錄(如果不需要,可以直接刪除,不影響apiex核心功能)
????????//?對thinkphp的model類中的某些方法擴展和新功能添加
????????\\application\\common\\library\\traits\\ModelExtend.php
????????//?對thinkphp的validate類中的某些方法擴展和新功能添加
????????\\application\\common\\library\\traits\\ValidateExtend.php
????????//?URL?解析類
????????\\application\\common\\library\\Urlparse.php
????????//?頁碼計算器
????????\\application\\common\\library\\PageCalculator.php
```
### 使用說明:
* apiex是對api的繼承和擴展,因而,只要在原始使用api的控制器中引入apiex并改為繼承apiex即可。
* 其他的功能擴展需要在對應的model和validate中引入對應trait。
* 注意:apiex原則上不會影響已經開發完成的功能,即不會與原始api產生沖突,可放心使用。
### 功能說明
* apiex無法獨立存在,它是依附于api基類存在的,是對?api?在?數據庫操作方面?和?接口安全?的擴展。、
* 基礎的代碼邏輯與backend一致,即:在后臺怎么使用backend,就怎么使用apiex。
* 由于后臺的權限是基于admin表進行控制,而api部分是基于user表進行控制,因而,有些權限方面的開發會有缺失。針對這一方面,盡量進行了彌補,即,可以在數據表中,加入?user\_id?,然后,在控制器中,設置protected?$dataLimit?=?'personal';?來實現用戶對于數據的權限控制,目前,由于user表邏輯中,不存在上下級關系,因而,只能實現person邏輯,而無法具備?auth?邏輯。
### 其他擴展功能說明
* 對于“對thinkphp的model類中的某些方法擴展和新功能添加方面”方面
* 此功能擴展主要是對model中的場景驗證進行完善。
* 增加“實時設置場景驗證方法”和“重寫“自動驗證數據”,使得驗證類可以支持實時的場景驗證。”
* 所謂“實時設置場景驗證方法”,與現有的場景驗證不同的是,當前場景驗證是對前臺提交的數據進行“死規則驗證”(所謂死規則驗證就是指驗證規則一旦寫死,將不能對某些參數值進行修改)。這樣的驗證不具有靈活性,不能結合控制器中的邏輯判斷進行進一步驗證。
* 示例:現在前臺提交了用戶的文章信息,后臺所有用戶的文章均保存在同一張表中,此時,要求對于同一用戶,不允許出現文章標題重復,而不同的用戶可以實現標題重復。
* 分析:面對這樣的要求,只是使用簡單的字段唯一性驗證已經不能滿足,而使用tp提供的多字段唯一驗證的前提條件是,前臺提交的數據包含了所有需要進行唯一性驗證的數據。具體來說,我們這里要判斷?user\_id,title?兩個字段同時相同時,才認為此數據是重復數據,而依照fastadmin的權限驗證邏輯,前臺是無需提交?user\_id的,而只需要提交token或者賬號密碼,當然,如果非要說我就是要求前臺提交user\_id,那么也可以,但是,如果現在就只要求前臺提交token或賬號密碼信息,則此時我們只能從auth類中獲取user\_id,那么,這就要求我們的驗證規則中的user\_id部分必須是動態的。
* 解決:
```
?????????????//?增加“實時設置場景驗證方法”。
????????????????/**
???????????????? *?實時設置場景驗證方法
???????????????? *?@param?Array?$sence?\[description\]
???????????????? */
????????????????public?function?setCurrentScene(Array?$scene)
????????????????//?使用方法:
????????????????//?在對應需要此驗證方法的model中,引入此traits
????????????????/**
???????????????? *?引入對thinkphp的model類中的某些方法擴展和新功能添加的traits
???????????????? */
????????????????use?\\app\\common\\library\\traits\\ModelExtend;
????????????????//?在對應控制器的方法中,添加如下場景設置:
????????????????$name?=?str\_replace("\\\\model\\\\",?"\\\\validate\\\\",?get\_class($this->model));
????????????????$validate?=?is\_bool($this->modelValidate)???($this->modelSceneValidate???$name?.?'.add'?:?$name)?:?$this->modelValidate;
????????????????//設置添加時的場景驗證
????????????????$currentScene?=?[
????????????????????'add'?=>?[
????????????????????????"name"?=>?"require|unique:monitoring_plan,name,'','',".$params['user_id'].",user_id,deletetime",
????????????????????????'first_keywords'?=>?"requireIf:second_keywords^third_keywords,''^''",
????????????????????????'second_keywords'?=>?"requireIf:first_keywords^third_keywords,''^''",
????????????????????????'third\_keywords'?=>?"requireIf:second\_keywords^first\_keywords,''^''",
????????????????????],
????????????????];
????????????????//設置驗證類的基礎驗證信息
????????????????$this->model->validate($validate)->setCurrentScene($currentScene);
????????????????//?此場景驗證只能設置一個場景,如只設置?add?或?edit?,不能一起設置,畢竟是為了實時場景進行的驗證。
????????????????//?設置實時的場景驗證時,需要依賴對validate的重寫traits,具體的調用方法看下面的“對thinkphp的validate類中的某些方法擴展和新功能添加”的說明即可。
```
* 對于“對thinkphp的validate類中的某些方法擴展和新功能添加”方面
* 目前,主要是對已有方法的重寫,但是,為了兼容其原始功能,保留了其原始功能和使用方法的基礎上,進行了二次開發。所以,不會破壞已有的判斷邏輯。
* 重寫的方法如下:
* requireIf
* unique
* scene
* 具體重寫后的功能和使用方法可以參考對應代碼注釋
* 引入和使用方法:
```
?//在對應已有的validate中,進入此traits
/**
*?對thinkphp的validate類中的某些方法擴展和新功能添加的traits\
*/
use?\\app\\common\\library\\traits\\ValidateExtend;
//?此時,由于traits的作用,使得原始的驗證方法失效,轉而使用重寫的方法,當然,重寫后的方法仍然支持官方提供的調用方法和使用邏輯,可以放心使用。
```
* 對于“URL?解析類”方面
* 此解析類的出現,是為了彌補php本身parse_url函數的功能缺失問題。
* 目前,parse_url?在進行url分析后,只能獲取攜帶主機信息的完整域名信息,但是無法獲取根域名,因而,對應給出了此解析類。
* 目前,此解析類提供兩種方法
* 根據URL提取根域名:getBaseDomain(string?$url)
* 判斷是否為正確域名:isDomain($domain)
* 使用方法:
```
???//?為了方便作為工具類使用,getBaseDomain使用了靜態方法定義,如下調用即可:
???//?調用URL?解析類中的根據URL提取根域名方法,分析并獲取用戶輸入的根域名
???$domain?=?\\app\\common\\library\\Urlparse::getBaseDomain($url);
```
* 對于“頁碼計算器”方面
* 頁碼計算器時為了面向對于一批數據進行分頁時,需要計算開始位置和給出總頁數而設計的簡單工具類。
* 目前已有的方法:
* 計算總頁數:pageAll($dataCount,?$pageShow)
* 根據傳入的分頁要求,計算后給出limit開始位置:?pageStart($dataCount,?$pageShow,?$page)
* 使用方法:由于兩個方法均使用靜態方法定義,因而可以通過直接調用使用。
```
??//?計算總頁數:
$totalPage?=?\\app\\common\\library\\PageCalculator::pageAll($dataCount,?$pageShow);
//?獲取頁碼開始位置:
$limitStart?=?\\app\\common\\library\\PageCalculator::pageStart($dataCount,?$pageShow,?$page);
//?具體參數說明請直接參考代碼注釋。
```