該存儲庫包含一個能夠輕鬆使用PHP進行restapi的框架
PDOUtils類Repository庫類,以便使用PDOUtilsApiException.php類Rest::handleRequest在升級時返回HTTP 409Rest::existFile函數Singleton設計模式改進了服務Controller->getAll函數Rest::scalePicture函數dbIgnore功能Controller->getByFields功能Rest::uploadFile函數Rest::$uploadDirRest::getUploadDir()Rest::configureUploadDir()Rest::createDirectoryRecursive()Guards功能Role枚舉KeyValue和KeyValueList結構類Service和Repository庫類Credentials類deleteByField()函數getByField()函數,它現在返回Model[]而不是Model首先,您必須創建一個文件夾(我命名為/rest ),然後將ApiRest文件夾放在其中。主文件將是api.php :它將創建RESTAPI,連接到數據庫並收聽請求。
這是此文件中的默認內容:
<?php
require_once __DIR__ . " /ApiRest/RestAPI.php " ;
header ( ' Content-Type: application/json ' );
header ( ' Access-Control-Allow-Headers: Content-Type, enctype, token ' );
header ( ' Access-Control-Allow-Origin: * ' );
header ( ' Access-Control-Allow-Methods: GET, POST, PUT, DELETE ' );
$ restAPI = new RestAPI ( " localhost " , " myDB " , " root " , "" );
// You can add an argument to improve the security of your session like this :
//$restAPI = new RestAPI("localhost", "myDB", "root", "", "m*;rO)P7^)3'k[F'S~h0Lx7{zN%`6S");
Rest:: configureUploadDir ( " rest-upload " );
echo $ restAPI -> handleRequest ();現在,RESTAPI已準備好使用。您可以與Postman進行檢查,並使用GET方法點擊URL: http://your-domain/your-path/rest/api.php/user /user。
很酷,但是Restapi如何處理呢?
api.php之後獲取這個詞(這是user一詞)user目錄是否存在user/include.php文件UserControllerprocessUrl在user目錄中,您將找到一個示例,可以在User對像中為API REST添加路徑。每個與特定對象 /類 /表相關的文件都必須在同一文件夾中,並遵循與用戶相同的規則:
/modelname/include.phpModelName.controller.phpModelName.model.phpModelName.repository.phpModelName.service.php 控制器是RESTAPI調用的第一層。它們必須這樣命名: modelClassName + "Controller" 。默認情況下,默認情況下會生成這些路徑:
api.php/modelClassNameapi.php/modelClassName/$idapi.php/modelClassNameapi.php/modelClassNameapi.php/modelClassName/$id默認情況下,生成的每個路徑都與防護彈圈關聯。如果要刪除防護罩,則必須通過在控制器中聲明它來覆蓋APIROUTE。
您可以通過在URL上添加獲取值來在GetAll函數上添加過濾器。例子 :
api.php/modelClassName?lastname=Doe
這是UserController類的示例:
<?php
// FILE rest/user/User.controller.php
require_once __DIR__ . " /../ApiRest/Rest.php " ;
require_once __DIR__ . " /../ApiRest/Controller.php " ;
class UserController extends Controller {
public function __construct ( string $ modelName ) {
parent :: __construct ( $ modelName );
$ this -> createApiRoute (Rest:: PUT , ' login ' , " login " );
$ this -> createApiRoute (Rest:: POST , ' picture ' , " uploadPicture " , [ new LoginGuard ()]);
}
/* PUT */
public static function login ( array $ params , stdClass $ body ): string {
$ user = User:: fromJSON ( $ body );
return static :: $ service -> login ( $ user );
}
public static function uploadPicture (): string {
$ fileName = " htmlInputName " ;
$ newName = " profilePicture.png " ;
Rest:: uploadFile ( $ fileName , $ newName );
return "" ;
}
}當您調用createApiRoute()函數時,第二個參數對應於請求的路徑。在此字符串中,您可以添加此類動態參數,例如'customPath/$param1/$param2/anything' 。然後,當調用關聯函數時,您會在$params變量上找到$param1和$param2的值:
var_dump ( $ params );
// print :
// array(
// "param1" => "value1",
// "param2" => "value2",
//)如果它們沒有相同數量的參數,則可以用另一條路線覆蓋路線,而無需刪除路線。例如,將保留這些路線:
$ this -> createApiRoute (Rest:: GET , ' $id ' , " getById " );
$ this -> createApiRoute (Rest:: GET , ' current ' , " getCurrent " );如果可能的話,將觸發“電流”路由。如果不是這樣,將觸發“ $ id”路線。
服務是控制器調用的下一個層:它們位於控制器類和存儲庫類之間。服務用於從Repository庫類獲取數據並製作數據。
Service類還可以致電其他服務跨數據並進行特殊過程。
默認情況下,生成了與控制器路徑相關的功能:
getAll()getByID(string $id)create()update()delete(string $id)這是UserService類的示例:
<?php
// FILE rest/user/User.service.php
require_once __DIR__ . " /../ApiRest/Service.php " ;
class UserService extends Service {
public function login ( User $ user ): string {
return $ this -> repository -> login ( $ user );
}
function initialize () { }
}如果您想在這些類別中使用其他Service ,則必須將其聲明並在initialize函數中初始化Service類:
<?php
class UserService extends Service {
/** @var $bookService BookService */
public $ bookService ;
public function login ( User $ user ): string {
return $ this -> repository -> login ( $ user );
}
function initialize () {
$ this -> bookService = BookService:: getInstance ( " Book " );
}
}存儲庫是服務所調用的最後一層。它們包含SQL查詢並從數據庫中獲取模型對象。
與服務相同,默認情況下可以使用這些函數:
getAll()getByID(string $id)create()update()delete(string $id)這是UserRepository類的示例:
<?php
// FILE rest/user/User.repository.php
require_once __DIR__ . " /../ApiRest/Repository.php " ;
class UserRepository extends Repository {
public function __construct () {
parent :: __construct ( " user " , ' User ' );
}
public function login ( User $ user ): string {
$ fields = new KeyValueList ([
new KeyValue ( " name " , $ user -> name ),
new KeyValue ( " password " , $ user -> password )
]);
$ matchedUsers = $ this -> getByFields ( $ fields );
if ( count ( $ matchedUsers ) != 1 )
throw new Exception ( " UserRepository->login() : $ matchedUsers have a size of " . count ( $ matchedUsers ) . " instead of 1 ! " );
$ loggedUser = $ matchedUsers [ 0 ];
if ( $ loggedUser )
return Rest:: IDToToken ( $ loggedUser -> id );
else
return "" ;
}
}如果要使用自定義SQL查詢,則可以使用Pdoutils類來執行它們。這是一個示例:
$ query = " < CUSTOM_SELECT_QUERY > " ;
$ PDOStatement = PDOUtils:: executeQuery ( $ query );
return static :: getByPDOStatement ( $ PDOStatement );您可以從PDOUtils使用一些功能:
executeQuery(query)executeQueryWithParameter(query, keyValue)executeQueryWithParameters(query, KeyValueList)模型是代表數據庫中的一行的類。
從數據庫中檢索數據時,布爾值不等於true / false而是'1' / '0' 。為了恢復我們被盜的布爾值,您可以調用函數preserveBooleans()轉換布爾字段。
要標記像布爾字段這樣的字段,只需在構造函數中調用此功能: addBoolean("booleanField1", "booleanField2", ...)
以同樣的方式,您可以通過調用函數addIgnore("ignoredField1", ...)將字段標記為jsonignore。然後,要將模型的實例轉換為JSON調用encode()函數!
還有另一個功能: addDbIgnore("field1", ...)用於指定數據庫中未存儲哪些字段。
模型類可以使用此靜態功能從JSON檢索: Model::fromJSON(stdClass $data) 。
警衛根據用戶的角色來限制數據訪問。默認情況下創建了三個後衛:
AdminGuardModeratorGuardLoginGuard他們都擴展了Guard抽像類,並實現了authorizeAccess(): bool函數。您也可以按照相同的規則創建自己的警衛,然後在Guard目錄中的include.php文件中添加新行。
當您聲明路線時,在控制器類中召集了警衛。請注意,路線可以具有0、1或多個後衛。
當有問題在前端網站上顯示出一個問題時,可以提出異常。為此,您必須投擲一個ApiException ,並且服務器將響應HTTP 409錯誤。
ApiException類擴展了Exception類,但它不使用超級類別的參數。
此類以輕鬆使用某些國際化工具的方式進行了製作:它包含一個key參數,該參數可以是JSON文件中翻譯的關鍵,而parameters參數包含要傳輸的數據。例如,這是一個apiexception和相關的JSON國際化文件:
throw new ApiException ( " api-error.error1 " , [ " name " => ' John ' ]);{
"api-error" : {
"error1" : {
"title" : " Hey ! " ,
"text" : " Hello {{name}} "
}
}
}使用ApieXception時,這些數據將存儲在HttpErrorResponse JavaScript項目的error屬性中。
添加強迫每個模型字段類型的能力,否則,現在沒有計劃的未來改進。並不意味著該軟件包不會更新!