Loading repository data…
Loading repository data…
star-inc / repository
Abigail is the fork from marcj/php-rest-service, which is a simple and fast PHP microservice framework for server side RESTful APIs.
Abigail is the fork from marcj/php-rest-service, which is a simple and fast PHP microservice framework for server side
RESTful APIs.
OPTIONS method based on PHPDoc (if OPTIONS is not
overridden)GET, POST, PUT, DELETE, PATCH, HEAD and OPTIONShttpMethod as addition to the actual HTTP method.reflectionCreate a composer.json:
{
"require": {
"starinc/abigail": "*"
}
}
then run
$ wget https://getcomposer.org/composer.phar
$ php composer.phar install
After the installation, you need to include the vendor/autoload.php to make the class in your script available.
include 'vendor/autoload.php';
#.htaccess
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule (.+) index.php/$1 [L,QSA]
// edit virtualhost /etc/nginx/conf.d/name_virtualhost_file
server {
.. something params ...
location / {
include fastcgi_params;
fastcgi_pass unix:/var/run/php-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root/index.php;
}
}
// and add line to /etc/nginx/fastcgi_params
fastcgi_param PATH_INFO $fastcgi_script_name;
use Abigail\Server;
Server::create('/')
->addGetRoute('test', function(){
return 'Yay!';
})
->addGetRoute('foo/(.*)', function($bar){
return $bar;
})
->addPostRoute('foo', function($field1, $field2) {
// do stuff with $field1, $field2, etc.
// or you can directly get them with $_POST['field1'].
})
->run();
index.php:
use Abigail\Server;
Server::create('/admin', 'myRestApi\Admin')
->collectRoutes()
->run();
MyRestApi/Admin.php:
namespace MyRestApi;
class Admin {
/**
* Checks if a user is logged in.
*
* @return boolean
*/
public function getLoggedIn(){
return $this->getContainer('auth')->isLoggedIn();
}
/**
* @param string $username
* @param string $password
* @return boolean
*/
public function postLogin($username, $password){
return $this->getContainer('auth')->doLogin($username, $password);
}
/**
* @param string $server
* @url stats/([0-9]+)
* @url stats
* @return string
*/
public function getStats($server = '1'){
return $this->getServerStats($server);
}
}
Generates following entry points:
+ GET /admin/logged-in
+ POST /admin/login?username=&password=
+ GET /admin/stats/([0-9]+)
+ GET /admin/stats
index.php:
use Abigail\Server;
Server::create('/admin', new MyRestApi\Admin) //base entry points `/admin`
->setDebugMode(true) //prints the debug trace, line number and file if an exception has been thrown.
->addGetRoute('login', 'doLogin') // => /admin/login
->addGetRoute('logout', 'doLogout') // => /admin/logout
->addGetRoute('page', 'getPages')
->addPutRoute('page', 'addPage')
->addGetRoute('page/([0-9]+)', 'getPage')
->addDeleteRoute('page/([0-9]+)', 'deletePage')
->addPostRoute('page/([0-9]+)', 'updatePage')
->addGetRoute('foo/bar/too', 'doFooBar')
->addSubController('tools', \RestApi\Tools) //adds a new sub entry point 'tools' => admin/tools
->addDeleteRoute('cache', 'clearCache')
->addGetRoute('rebuild-index', 'rebuildIndex')
->done()
->run();
MyRestApi/Admin.php:
namespace MyRestApi;
class Admin {
public function login($username, $password){
if (!$this->validLogin($username, $password))
throw new InvalidLoginException('Login is invalid or no access.');
return $this->getToken();
}
public function logout(){
if (!$this->hasSession()){
throw new NoCurrentSessionException('There is no current session.');
}
return $this->killSession();
}
public function getPage($id){
//...
}
}
namespace RestAPI;
class Tools {
/**
* Clears the cache of the app.
*
* @param boolean $withIndex If true, it clears the search index too.
* @return boolean True if the cache has been cleared.
*/
public function clearCache($withIndex = false){
return true;
}
}
The response body is always an array (JSON per default) containing a status code and the actual data. If an exception has been thrown, it contains the status 500, the exception class name as error, and the message as message.
Some examples:
+ GET admin/login?username=foo&password=bar
=>
{
"status": "200",
"data": true
}
+ GET admin/login?username=foo&password=invalidPassword
=>
{
"status": "500",
"error": "InvalidLoginException",
"message": "Login is invalid or no access"
}
+ GET admin/login
=>
{
"status: "400",
"error": "MissingRequiredArgumentException",
"message": "Argument 'username' is missing"
}
+ GET admin/login?username=foo&password=invalidPassword
With active debugMode we'll get:
=>
{
"status": "500",
"error": "InvalidLoginException",
"message": "Login is invalid or no access",
"line": 10,
"file": "libs/RestAPI/Admin.class.php",
"trace": <debugTrace>
}
+ GET admin/tools/cache
=>
{
"status": 200,
"data": true
}
Licensed under the MIT License. See the LICENSE file for more details.
Take a look into the code, to get more information about the possibilities. It's well documented.