Nota Bene: This project uses semver and changelog. But it's not a stable major version. Any minor update (f.e. 0.5.* -> 0.6.*) can break backward compatibility!
Simple PHP7 framework for fast building REST services based on middleware, PSR-7 and react.
Runned instance can be found by link, also see example repo.
- Middleware oriented request/response handling
- Priority PSR's support: PSR-2, -3, -4, -7, -11, -15 and other.
- Built-in Middleware to support usual REST features, like HTTP based semantics, content types, request parsing, headers.
- Choose one of two available http-daemon drivers: Ratchet ReactPHP or Aerys.
- Swagger Integration
$ composer require free-elephants/rest-daemon
See example in example/rest-server.php and documentation.
# your rest-server.php script
$server = new RestServer('127.0.0.1', 8080, '0.0.0.0', ['*']); // <- it's default arguments values
$server->run();
# can be runned as
$ php ./rest-server.php
Any endpoint method handler can be Middleware-like callable implementation: function or class with __invoke() method.
<?php
class GetAttributeHandler extends AbstractEndpointMethodHandler
{
public function __invoke(ServerRequestInterface $request, ResponseInterface $response, callable $next)
{
$name = $request->getAttribute('name', 'World');
$response->getBody()->write('{
"hello": "' . $name . '!"
}');
return $next($request, $response);
}
}
$greetingAttributeEndpoint = new BaseEndpoint('/greeting/{name}', 'Greeting by name in path');
$greetingAttributeEndpoint->setMethodHandler('GET', new GetAttributeHandler());
$server->addEndpoint($greetingAttributeEndpoint);
See how to build server for step by step in one script
You can use php-di (or another PSR-11 container implementation) and routing file configuration with RestServerBuilder for more configuring and coding less.
See example with file based routing and dependencies configuration: rest-server.php
You can link with every method in route a handler, and optionally organize routes by modules. By default server contain 1 default module for all endpoints. See example: routes.php
By default server instance provide collection with some useful middleware. You can extend or override it:
<?php
$requestCounter = function (
ServerRequestInterface $request,
ResponseInterface $response,
callable $next
) {
static $requestNumber = 0;
printf('[%s] request number #%d handled' . PHP_EOL, date(DATE_ISO8601), ++$requestNumber);
return $next($request, $response);
};
$extendedDefaultMiddlewareCollection = new DefaultEndpointMiddlewareCollection([], [$requestCounter]);
$server->setMiddlewareCollection($extendedDefaultMiddlewareCollection);
Every endpoint's method handler will be wrapped to this collection and called between defined as after
and before
middleware.
Also you can configure default middleware collection with access to every built-in middleware by key: this collection implements ArrayAccess interface.
<?php
$server->getMiddlewareCollection()->getBefore()->offsetUnset(\FreeElephants\RestDaemon\Middleware\MiddlewareRole::NO_CONTENT_STATUS_SETTER);
... Will be implemented...
... Will be implemented...