by marcj

Php-Rest-Service is a very simple and fast PHP class for server-side RESTful JSON APIs.

212 Stars 70 Forks Last release: Not found MIT License 67 Commits 8 Releases

Available items

No Items, yet!

The developer of this repository has not created any items for sale yet. Need a bug fixed? Help with integration? A different license? Create a request here:


Php-Rest-Service is a simple and fast PHP class for RESTful JSON APIs.

Build Status


  • Easy to use syntax
  • Regular Expression support
  • Error handling through PHP Exceptions
  • Parameter validation through PHP function signature
  • Can return a summary of all routes or one route through
    method based on PHPDoc (if
    is not overridden)
  • Support of
  • Suppress the HTTP status code with ?suppressstatus_code=1 (for clients that have troubles with that)
  • Supports ?_method=
    as addition to the actual HTTP method.
  • With auto-generation through PHP's


  • More information available under

Create a

    "require": {
        "marcj/php-rest-service": "*"

and run

$ wget
$ php composer.phar install

After the installation, you need to include the

to make the class in your script available.
include 'vendor/autoload.php';


  • PHP 5.3 and above.
  • PHPUnit to execute the test suite.
  • Setup PATHINFO in modrewrite (.htaccess) or other webserver configuration

Example config:

apache webserver

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f RewriteRule (.+) index.php/$1 [L,QSA]

nginx webserver

// edit virtualhost /etc/nginx/conf.d/name_virtualhost_file
server {
 .. something params ...
 location / {
  include fastcgi_params;

fastcgi_pass unix:/var/run/php5-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;

Usage Demo

Way 1. The dirty & fast

use RestService\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();

Way 2. Auto-Collection

use RestService\Server;

Server::create('/admin', 'myRestApi\Admin') ->collectRoutes() ->run();

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

Way 3. Custom rules with controller

use RestService\Server;

Server::create('/admin', new MyRestApi\Admin) //base entry points /admin ->setDebugMode(true) //prints the debug trace, line number and file if a 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')


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 a array (JSON per default) containing a status code and the actual data. If a 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": }

  • 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.

Bitdeli Badge

We use cookies. If you continue to browse the site, you agree to the use of cookies. For more information on our use of cookies please see our Privacy Policy.