<?php
namespace FluentForm\Framework\Http;
use FluentForm\Framework\Support\Arr;
class Router
{
protected $app = null;
protected $name = [];
protected $prefix = [];
protected $routes = [];
protected $routeGroups = [];
protected $groupStack = [];
protected $policyHandler = null;
public function __construct($app)
{
$this->app = $app;
}
public function prefix($prefix)
{
$this->prefix[] = $prefix;
return $this;
}
public function name($name)
{
$this->name[] = $name;
return $this;
}
public function group($attributes = [], \Closure $callback = null)
{
if ($attributes instanceof \Closure) {
$callback = $attributes;
$attributes = [];
}
if (isset($attributes['name'])) {
$this->name($attributes['name']);
}
if (isset($attributes['prefix'])) {
$this->prefix($attributes['prefix']);
}
if (isset($attributes['policy'])) {
$this->withPolicy($attributes['policy']);
}
call_user_func($callback, $this);
array_pop($this->prefix);
array_pop($this->name);
}
public function withPolicy($handler)
{
$this->policyHandler = $handler;
return $this;
}
public function get($uri, $handler)
{
$this->routes[] = $route = $this->newRoute(
$uri, $handler, 'GET'
);
return $route;
}
public function post($uri, $handler)
{
$this->routes[] = $route = $this->newRoute(
$uri, $handler, 'POST'
);
return $route;
}
public function put($uri, $handler)
{
$this->routes[] = $route = $this->newRoute(
$uri, $handler, 'PUT'
);
return $route;
}
public function patch($uri, $handler)
{
$this->routes[] = $route = $this->newRoute(
$uri, $handler, 'PATCH'
);
return $route;
}
public function delete($uri, $handler)
{
$this->routes[] = $route = $this->newRoute(
$uri, $handler, 'DELETE'
);
return $route;
}
public function any($uri, $handler)
{
$this->routes[] = $route = $this->newRoute(
$uri, $handler, \WP_REST_Server::ALLMETHODS
);
return $route;
}
protected function newRoute($uri, $handler, $method)
{
$route = Route::create(
$this->app,
$this->getRestNamespace(),
$this->buildUriWithPrefix($uri),
$handler,
$method,
implode('', $this->name)
);
if ($this->policyHandler) {
$route->withPolicy($this->policyHandler);
}
return $route;
}
protected function getRestNamespace()
{
$version = $this->app->config->get('app.rest_version');
$namespace = trim($this->app->config->get('app.rest_namespace'), '/');
return "{$namespace}/{$version}";
}
protected function buildUriWithPrefix($uri)
{
$uri = trim($uri, '/');
$prefix = array_map(function($prefix) {
return trim($prefix, '/');
}, $this->prefix);
$prefix = implode('/', $prefix);
return trim($prefix, '/') . '/' . trim($uri, '/');
}
public function registerRoutes()
{
foreach ($this->routes as $route) $route->register();
}
public function getRoutes()
{
return $this->routes;
}
}