usox / sharesta
restful json api creation using strict hack
Installs: 1 032
Dependents: 0
Suggesters: 0
Security: 0
Stars: 5
Watchers: 3
Forks: 1
Open Issues: 0
Language:Hack
Requires
- hhvm: ^4.1
- hhvm/hsl: ^4.1
- hhvm/hsl-experimental: ^4.50
- hhvm/type-assert: ^3
Requires (Dev)
- hhvm/hhast: ^4.1
- usox/hackmock: ^1
README
A micro framework to build simple and easy to use rest-like apis - written in strict hack (Hack).
Usage
First, build some classes containing your logic..
final class HomeRoute implements \JsonSerializable { public function jsonSerialize(): string { return 'Welcome home'; } } final class UpdateUserRoute implements \JsonSerializable { public function __construct( private int $user_id, private \Usox\Sharesta\RequestInterface $request ): void { } public function jsonSerialize(): bool { // do some magic, e.g. access the request body by $this->request return true; } }
Now create a class containing your route configurations.
final class Routes implements Usox\Sharesta\RoutesInterface { public function registerRoutes(Usox\Sharesta\RouterInterface $router): void { $router->get( '/', (Usox\Sharesta\RequestInterface $request): \JsonSerializable ==> { return new HomeRoute(); } ); /** * Get variables from the path (e.g. `http://some.tld/users/123`) */ $router->post( '/users/:id', (Usox\Sharesta\RequestInterface $request): \JsonSerializable ==> { return new UpdateUserRoute( $request->getUriValues('id'), $request->getRequestBody() ); } ); } }
Setup sharesta, register your routes and let the application controller handle your requests.
<?hh // strict require_once 'vendor/autoload.php'; <<__Entrypoint>> function main(): noreturn { /* HH_IGNORE_ERROR[2050] */ $get_vars = dict($_GET); /* HH_IGNORE_ERROR[2050] */ $server_vars = dict($_SERVER); $factory = new Usox\Sharesta\ApiFactory(); $router = $factory->createRouter( $server_vars, $get_vars ); $routes = new Routes(); $routes->registerRoutes($router); $router->route( '' // path to the file. Leave it empty if your server configuration defaults to index.hh ); die(0); }
Example
See example/webroot/index.hh
for an example.