<?php
namespace BitApps\WPKit\Http\Router;
use Closure;
use RuntimeException;
/**
* Base class for route
*
* @method static RouteRegister match($methods, $path, callable$action)
* @method static RouteRegister get($path, callable $action)
* @method static RouteRegister post($path, callable $action)
* @method static RouteRegister getMethods()
* @method static RouteRegister action(callable $action)
* @method static RouteRegister getAction()
* @method static RouteRegister path($path)
* @method static RouteRegister getPath()
* @method static RouteRegister name($name)
* @method static RouteRegister getName()
* @method static RouteRegister isNoAuth()
* @method static RouteRegister isTokenIgnored()
* @method static RouteRegister regex()
* @method static RouteRegister hasRegex()
* @method static RouteRegister handleMiddleware()
* @method static RouteRegister getRoutePrefix()
* @method static RouteRegister getRouteParam($name)
* @method static RouteRegister getRouteParams()
* @method static RouteRegister setRouteParamValue($name, $value)
* @method static RouteRegister getRouteParamValue($name)
* @method static RouteRegister getRouteParamValues()
* @method static RouteRegister setRequest(Request $request)
* @method static RouteRegister getRequest()
*/
final class RouteBase
{
private $_router;
private $_prefix;
private $_noAuth;
private $_ignoreToken;
private $_middleware = [];
private static $_isGrouped;
/**
* Handle static call to route.
*
* @param string $method Name of method from RouteBase
* @param mixed $parameters Params to pass
*
* @return RouteRegister
*/
public function __call($method, $parameters)
{
if (method_exists(RouteRegister::class, $method)) {
$route = \call_user_func_array([$this->getRegistrar(), $method], $parameters);
$this->getRouter()->addRoute($route);
return $route;
}
throw new RuntimeException('Undefined method [' . $method . '] called on ' . __CLASS__ . ' class.');
}
public static function __callStatic($method, $parameters)
{
return (new static())->{$method}(...$parameters);
}
/**
* Sets prefix for route.
*
* @param string $prefix prefix for route or route group
*
* @return RouteBase
*/
public function prefix($prefix)
{
$this->_prefix = $prefix;
return $this;
}
/**
* Sets if ajax route is also for frontend request.
*
* @return RouteBase
*/
public function noAuth()
{
$this->_noAuth = true;
return $this;
}
/**
* Returns if ajax route is also for frontend request.
*
* @return bool
*/
public function isNoAuth()
{
return $this->_noAuth;
}
/**
* Checks if token ignored for the request.
*
* @return bool
*/
public function isTokenIgnored()
{
return $this->_ignoreToken;
}
/**
* Sets if token ignored for request.
*
* @return RouteBase
*/
public function ignoreToken()
{
$this->_ignoreToken = true;
return $this;
}
/**
* Sets middleware for route.
*
* @return RouteBase
*/
public function middleware()
{
$this->_middleware = (array) $this->_middleware + \func_get_args();
return $this;
}
/**
* Returns middleware for this request.
*
* @return []
*/
public function getMiddleware()
{
return $this->_middleware;
}
/**
* Return prefix for request.
*
* @return null|string
*/
public function getRoutePrefix()
{
return $this->_prefix;
}
/**
* Sets routes to a group using closure.
*
* @param Closure $callback function to set multiple route
*
* @return $this
*/
public function group(Closure $callback)
{
self::$_isGrouped = $this;
$callback();
self::$_isGrouped = null;
return $this;
}
/**
* Provides router for this route.
*
* @return Router
*/
public function getRouter()
{
if (!isset($this->_router)) {
$this->_router = Router::instance();
}
return $this->_router;
}
/**
* Provides registrar for this route.
*
* @return RouteRegister
*/
private function getRegistrar()
{
$instance = $this;
if (!\is_null(self::$_isGrouped)) {
$instance = self::$_isGrouped;
}
return new RouteRegister($instance);
}
}