このリポジトリには、PHPで簡単にRESTAPIを実行できる小さなフレームワークが含まれています
PDOUtilsクラスを追加しましたPDOUtilsを使用するために、クリーニングされたRepositoryクラスApiException.phpクラスを追加しましたRest::handleRequest例外が提起されたときRest::existFile関数Singletonデザインパターンを使用したサービスの改善Controller->getAll関数をサポートしますRest::scalePicture関数を追加しましたdbIgnore機能を追加しましたController->getByFields機能を追加しましたRest::uploadFile関数Rest::$uploadDirRest::getUploadDir()Rest::configureUploadDir()を追加Rest::createDirectoryRecursive()Guards機能を追加しましたRole列挙を追加しましたKeyValueとKeyValueList Structureクラスを追加しました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/modelClassNameを投稿しますapi.php/modelClassNameを入れますapi.php/modelClassName/$idデフォルトでは、生成された各パスはガードログアードに関連付けられています。ガードを削除したい場合は、コントローラーで宣言してアピルーテをオーバーライドする必要があります。
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()関数を呼び出すと、2番目のパラメーターはリクエストのパスに対応します。この文字列には、この'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)これがユーザーサービスクラスの例です。
<?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'に等しくなりません。盗まれたブーチャンを取り戻すには、function preserveBooleans()を呼び出してブールフィールドを変換できます。
ブールフィールドのようなフィールドをマークするには、コンストラクター内のこの関数を呼び出すだけです: addBoolean("booleanField1", "booleanField2", ...)
同じように、関数addIgnore("ignoredField1", ...)を呼び出すことにより、フィールドをJsonignoreとしてマークすることができます。次に、モデルのインスタンスをJSONに変換するにはencode()関数を呼び出します!
別の関数があります: addDbIgnore("field1", ...)データベースに保存されていないフィールドを指定するために使用されます。
モデルクラスは、この静的関数を使用してJSONから取得できます: Model::fromJSON(stdClass $data) 。
ガードは、ユーザーの役割に応じてデータアクセスを制限するために使用されます。デフォルトでは、3人の警備員が作成されます。
AdminGuardModeratorGuardLoginGuardそれらはすべてGuard抽象クラスを拡張し、 authorizeAccess(): bool関数を実装します。同じルールに従って独自のガードを作成し、 include.phpファイルに新しい行をGuardディレクトリに追加することもできます。
ガードは、ルートを宣言するときに、コントローラークラスで呼び出されます。ルートには0、1、または複数のガードがあることに注意してください。
フロントエンドのWebサイトに表示される問題が表示される場合、例外を提起できます。そのためには、 ApiExceptionをスローする必要があり、サーバーはHTTP 409エラーで応答します。
ApiExceptionクラスはExceptionクラスを拡張しますが、スーパークラスのパラメーターは使用しません。
このクラスは、いくつかのInternationalization Frondendツールを簡単に使用する方法で作成されています。これは、JSONファイルの翻訳のキーとなる可能性のあるkeyパラメーターと、送信されるデータを含むparametersパラメーターを含んでいます。たとえば、ここにApiexceptionと関連するJSON Internationalizationファイルがあります。
throw new ApiException ( " api-error.error1 " , [ " name " => ' John ' ]);{
"api-error" : {
"error1" : {
"title" : " Hey ! " ,
"text" : " Hello {{name}} "
}
}
} Apiexceptionを使用する場合、これらのデータはHttpErrorResponse JavaScriptアイテムのerrorプロパティに保存されます。
それ以外の場合は、各モデルのフィールドのタイプを強制する能力を追加します。今では将来の改善は計画されていません。パッケージが更新されないという意味ではありません!