Controllers
Closure Handlers
The simplest handler is an inline closure:
use PhpCompatible\Router\Router;
Router::get('/users', function() {
return array('users' => get_all_users());
});
Single Action Controllers
Use invokable classes as route handlers:
class ShowUser
{
public function __invoke($request)
{
$id = $request->getParam('id');
return array('user' => get_user($id));
}
}
Router::get('/users/:id', ShowUser::class);
Controllers with Dependencies
class CreateUser
{
private $db;
public function __construct()
{
$this->db = new Database();
}
public function __invoke($request)
{
$data = $request->getParsedBody();
$user = $this->db->insert('users', $data);
return JsonResponse::response(HTTP_CREATED, array('user' => $user));
}
}
Router::post('/users', CreateUser::class);
Controllers with Request Injection
Controllers receive a ServerRequest object:
use PhpCompatible\Router\ServerRequest;
use PhpCompatible\Router\JsonResponse;
class UpdateUser
{
public function __invoke(ServerRequest $request)
{
$id = $request->getRouteParam(':id');
$data = $request->getParsedBody();
$user = update_user($id, $data);
if (!$user) {
return JsonResponse::response(HTTP_NOT_FOUND, array('error' => 'User not found'));
}
return JsonResponse::response(HTTP_OK, array('user' => $user));
}
}
Router::put('/users/:id', UpdateUser::class);
Resource Controllers
Organize CRUD operations in a single controller:
class UserController
{
public static function index()
{
return array('users' => get_all_users());
}
public static function show()
{
$id = $_GET[':id'];
return array('user' => get_user($id));
}
public static function store()
{
$data = json_body();
$user = create_user($data);
return JsonResponse::response(HTTP_CREATED, array('user' => $user));
}
public static function update()
{
$id = $_GET[':id'];
$data = json_body();
return array('user' => update_user($id, $data));
}
public static function destroy()
{
$id = $_GET[':id'];
delete_user($id);
return JsonResponse::response(HTTP_NO_CONTENT);
}
}
Router::run(function() {
Router::group('/api', function() {
Router::get('/users', 'UserController::index');
Router::post('/users', 'UserController::store');
Router::get('/users/:id', 'UserController::show');
Router::put('/users/:id', 'UserController::update');
Router::delete('/users/:id', 'UserController::destroy');
});
});
Array Callable Handlers
$controller = new UserController();
Router::run(function() use ($controller) {
Router::get('/users', array($controller, 'index'));
Router::get('/users/:id', array($controller, 'show'));
});