Repositori ini berisi kerangka kerja kecil yang mampu melakukan restapi dengan mudah dengan PHP
PDOUtilsRepository yang dibersihkan untuk menggunakan PDOUtilsApiException.phpRest::handleRequest untuk mengembalikan http 409 saat pengecualian dinaikkanRest::existFileSingletonController->getAllRest::scalePicturedbIgnoreController->getByFieldsRest::uploadFileRest::$uploadDirRest::getUploadDir()Rest::configureUploadDir()Rest::createDirectoryRecursive()Guards yang DitambahkanRoleKeyValue dan kelas struktur KeyValueListService dan Repository yang diperbaruiCredentialsdeleteByField()getByField() yang diperbarui, ia mengembalikan sekarang Model[] bukan Model Untuk memulai, Anda harus membuat folder (saya menamakannya /rest ) dan menempatkan folder ApiRest di dalamnya. File utama adalah api.php : Ini akan membuat restapi, terhubung ke DB dan mendengarkan permintaan.
Berikut adalah konten default dalam file ini:
<?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 (); Sekarang Restapi siap digunakan. Anda dapat memeriksanya dengan tukang pos dan menekan URL dengan metode GET : http://your-domain/your-path/rest/api.php/user .
Itu keren, tapi bagaimana restapi menanganinya?
api.php (ini adalah kata user )useruser/include.php fileUserControllerprocessUrl metode pengontrol Di direktori user , Anda akan menemukan contoh untuk menambahkan jalur ke istirahat API Anda untuk objek User . Setiap file yang terkait dengan objek / kelas / tabel tertentu harus berada di folder yang sama dan mengikuti aturan yang sama dengan pengguna:
/modelname/include.phpModelName.controller.phpModelName.model.phpModelName.repository.phpModelName.service.php Pengontrol adalah lapisan pertama yang dipanggil oleh Restapi. Mereka harus dinamai seperti ini: modelClassName + "Controller" . Secara default, jalur tesis dihasilkan secara default:
api.php/modelClassNameapi.php/modelClassName/$idapi.php/modelClassNameapi.php/modelClassNameapi.php/modelClassName/$idSecara default, setiap jalur yang dihasilkan dikaitkan dengan Logginguard penjaga. Jika Anda ingin menghapus penjaga, Anda harus mengesampingkan apiroute dengan menyatakannya di pengontrol Anda.
Anda dapat menambahkan filter pada fungsi getAll dengan menambahkan nilai GET pada URL. Contoh :
api.php/modelClassName?lastname=Doe
Berikut adalah contoh kelas 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 "" ;
}
} Saat Anda memanggil fungsi createApiRoute() , parameter kedua sesuai dengan jalur permintaan. Dalam string ini, Anda dapat menambahkan parameter dinamis seperti ini 'customPath/$param1/$param2/anything' . Kemudian, ketika fungsi terkait akan dipanggil, Anda akan menemukan nilai $param1 dan $param2 pada variabel $params :
var_dump ( $ params );
// print :
// array(
// "param1" => "value1",
// "param2" => "value2",
//)Anda dapat mengesampingkan rute dengan yang lain tanpa melepasnya, jika mereka tidak memiliki jumlah parameter yang sama. Misalnya, rute tesis akan disimpan:
$ this -> createApiRoute (Rest:: GET , ' $id ' , " getById " );
$ this -> createApiRoute (Rest:: GET , ' current ' , " getCurrent " );Jika memungkinkan, rute 'saat ini' akan dipicu. Jika tidak, rute '$ id' akan dipicu.
Layanan adalah lapisan berikutnya yang dipanggil oleh pengontrol: mereka berada di antara kelas pengontrol dan kelas repositori. Layanan digunakan untuk mendapatkan data dari kelas Repository dan membuat proses data.
Kelas Service juga dapat menghubungi layanan lain untuk melintasi data dan membuat proses khusus.
Secara default, fungsi yang terkait dengan jalur pengontrol dihasilkan:
getAll()getByID(string $id)create()update()delete(string $id)Berikut adalah contoh kelas UsersEver:
<?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 () { }
} Jika Anda ingin menggunakan Service lain di kelas tesis ini, Anda harus mendeklarasikannya dan untuk menginisialisasi kelas Service dalam fungsi initialize seperti ini:
<?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 " );
}
}Repositori adalah lapisan terakhir yang dipanggil oleh layanan. Mereka berisi kueri SQL dan mendapatkan objek model dari database.
Sama seperti layanan, secara default fungsi tesis tersedia:
getAll()getByID(string $id)create()update()delete(string $id)Berikut adalah contoh kelas 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 "" ;
}
}Jika Anda ingin menggunakan kueri SQL khusus, Anda dapat menggunakan kelas PDOUTILS untuk menjalankannya. Inilah contohnya:
$ query = " < CUSTOM_SELECT_QUERY > " ;
$ PDOStatement = PDOUtils:: executeQuery ( $ query );
return static :: getByPDOStatement ( $ PDOStatement ); Ada beberapa fungsi yang dapat Anda gunakan dari PDOUtils :
executeQuery(query)executeQueryWithParameter(query, keyValue)executeQueryWithParameters(query, KeyValueList)Model adalah kelas yang mewakili garis dalam database.
Ketika data diambil dari database, boolean tidak akan setara dengan true / false tetapi untuk '1' / '0' . Untuk mendapatkan kembali boolean curian kami, Anda dapat memanggil fungsi preserveBooleans() untuk mengonversi bidang boolean.
Untuk menandai bidang seperti bidang boolean, sebut saja fungsi ini di dalam konstruktor: addBoolean("booleanField1", "booleanField2", ...)
Dengan cara yang sama, Anda dapat menandai bidang sebagai jsonignore dengan memanggil fungsi addIgnore("ignoredField1", ...) . Kemudian, untuk mengonversi instance Model ke JSON Call The encode() Function!
Ada fungsi lain: addDbIgnore("field1", ...) yang digunakan untuk menentukan bidang mana yang tidak disimpan dalam database.
Kelas model dapat diambil dari JSON menggunakan fungsi statis ini: Model::fromJSON(stdClass $data) .
Penjaga digunakan untuk membatasi akses data tergantung pada peran pengguna. Tiga penjaga dibuat secara default:
AdminGuardModeratorGuardLoginGuard Mereka semua memperluas kelas abstrak Guard , dan mengimplementasikan fungsi authorizeAccess(): bool . Anda dapat membuat penjaga sendiri juga mengikuti aturan yang sama, dan kemudian menambahkan baris baru di file include.php di direktori Guard .
Penjaga dipanggil di kelas pengontrol, ketika Anda akan menyatakan rute. Perhatikan bahwa rute dapat memiliki 0, 1 atau beberapa penjaga.
Pengecualian dapat dinaikkan ketika ada masalah yang akan dicetak ditampilkan di situs web front-end. Untuk melakukannya, Anda harus melempar ApiException dan server akan merespons dengan kesalahan HTTP 409 .
Kelas ApiException memperluas kelas Exception , tetapi tidak menggunakan parameter dari superclass.
Kelas ini dibuat dengan cara untuk dengan mudah menggunakan beberapa alat internasionalisasi Frondend: Ini berisi parameter key yang dapat menjadi kunci terjemahan dalam file JSON, dan parameter parameters yang berisi data yang akan dikirimkan. Misalnya, di sini adalah sebuah ApiException dan file internasionalisasi JSON yang terkait:
throw new ApiException ( " api-error.error1 " , [ " name " => ' John ' ]);{
"api-error" : {
"error1" : {
"title" : " Hey ! " ,
"text" : " Hello {{name}} "
}
}
} Saat menggunakan ApiException, data ini akan disimpan di properti error dari item JavaScript HttpErrorResponse .
Tambahkan kapasitas memaksa jenis bidang masing -masing model, tidak ada peningkatan di masa depan yang direncanakan sekarang. Tidak berarti bahwa paket tidak akan diperbarui!