이 저장소에는 PHP로 쉽게 RESTAPI를 수행 할 수있는 작은 프레임 워크가 포함되어 있습니다.
PDOUtils 클래스가 추가되었습니다PDOUtils 사용하기 위해 정리 된 Repository 클래스ApiException.php 클래스가 추가되었습니다Rest::handleRequest 예외가 제기 될 때Rest::existFile 함수Singleton 디자인 패턴으로 개선 된 서비스Controller->getAll 함수에 대한 GET 매개 변수를 추가합니다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를 생성하고 DB에 연결하고 요청을 듣습니다.
이 파일의 기본 내용은 다음과 같습니다.
<?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가 사용할 준비가되었습니다. GET 메소드 ( http://your-domain/your-path/rest/api.php/user 로 우체부로 확인하고 URL을 누를 수 있습니다.
멋지지만 restapi는 어떻게 처리합니까?
api.php 이후에 단어 받기 (여기서는 user 단어입니다)user 디렉토리가 있는지 확인하십시오user/include.php 파일이 있는지 확인하십시오UserController 라는 컨트롤러를 만듭니다processUrl 호출하십시오 user 디렉토리에서는 User 객체에 대한 API REST에 경로를 추가하는 예제를 찾을 수 있습니다. 특정 객체 / 클래스 / 테이블과 관련된 각 파일은 동일한 폴더에 있어야하며 사용자와 동일한 규칙을 따라야합니다.
/modelname/include.phpModelName.controller.phpModelName.model.phpModelName.repository.phpModelName.service.php 컨트롤러는 restapi가 호출하는 첫 번째 레이어입니다. modelClassName + "Controller" 와 같이 이름을 지정해야합니다. 기본적 으로이 경로는 기본적으로 생성됩니다.
api.php/modelClassName 얻습니다api.php/modelClassName/$id 를 얻으십시오api.php/modelClassNameapi.php/modelClassName 넣으십시오api.php/modelClassName/$id 를 삭제합니다기본적으로 생성 된 각 경로는 Guard Loginguard와 관련됩니다. 가드를 제거하려면 Apiroute를 컨트롤러에 선언하여 Apiroute를 무시해야합니다.
URL에 get 값을 추가하여 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 () { }
} Theses 클래스에서 다른 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 function. 동일한 규칙에 따라 자신만의 가드를 만들 수있는 다음 Guard 디렉토리의 include.php 파일에 새 줄을 추가 할 수 있습니다.
경비원은 경로를 선언 할 때 컨트롤러 클래스에서 호출됩니다. 경로에는 0, 1 또는 다중 경비원이있을 수 있습니다.
프론트 엔드 웹 사이트에 표시해야 할 문제가있을 때 예외를 제기 할 수 있습니다. 그렇게하려면 ApiException 던져야하며 서버는 HTTP 409 오류로 응답합니다.
ApiException 클래스는 Exception 클래스를 확장하지만 슈퍼 클래스에서 매개 변수를 사용하지 않습니다.
이 클래스는 일부 국제화 Frondend 도구를 쉽게 사용할 수있는 방법으로 만들어집니다. JSON 파일의 변환 키가 될 수있는 key 매개 변수와 전송할 데이터를 포함하는 parameters 매개 변수가 포함되어 있습니다. 예를 들어 다음은 Apiexception 및 관련 JSON 국제화 파일입니다.
throw new ApiException ( " api-error.error1 " , [ " name " => ' John ' ]);{
"api-error" : {
"error1" : {
"title" : " Hey ! " ,
"text" : " Hello {{name}} "
}
}
} apiexception을 사용하는 경우,이 데이터는 HttpErrorResponse JavaScript 항목의 error 속성에 저장됩니다.
그렇지 않으면 각 모델의 필드 유형을 강제 할 수있는 용량을 추가하십시오. 그렇지 않으면 향후 개선이 계획되지 않았습니다. 패키지가 업데이트되지 않는다는 의미는 아닙니다!