<?php namespace BitApps\WPKit\Http\Router; use BitApps\WPKit\Hooks\Hooks; /** * Base Router. * * @var Router $_route */ final class AjaxRouter { private $_router; public function __construct(Router $router) { $this->_router = $router; } public function registerRoutes() { foreach ($this->_router->getRoutes() as $route) { $this->addRoute($route); } } public function addRoute(RouteRegister $route) { $requestMethod = isset($_SERVER['REQUEST_METHOD']) ? sanitize_text_field($_SERVER['REQUEST_METHOD']) : ''; $action = isset($_REQUEST['action']) ? sanitize_text_field($_REQUEST['action']) : ''; if (strpos($action, $route->getRouter()->getAjaxPrefix()) === false || !\in_array(strtoupper($requestMethod), $route->getMethods()) ) { return; } $requestPath = str_replace($route->getRouter()->getAjaxPrefix(), '', $action); if (!$this->isRouteMatched($route, $requestPath)) { return; } Hooks::addAction('wp_ajax_' . $action, [$route, 'handleRequest']); if ($route->isNoAuth()) { Hooks::addAction('wp_ajax_nopriv_' . $action, [$route, 'handleRequest']); } $route->getRouter()->addRegisteredRoute($this->currentRouteName(), $route); } public function currentRouteName() { $requestMethod = isset($_SERVER['REQUEST_METHOD']) ? sanitize_text_field($_SERVER['REQUEST_METHOD']) : ''; $action = isset($_REQUEST['action']) ? sanitize_text_field($_REQUEST['action']) : ''; return $requestMethod . $action; } /** * Returns current registered route. * * @return RouteRegister */ public function currentRoute() { return $this->_router->getRegisteredRoute($this->currentRouteName()); } private function isRouteMatched(RouteRegister $route, $requestPath) { if ($route->getRoutePrefix() . $route->getPath() === $requestPath) { return true; } if ( !$route->hasRegex() || preg_match('~^(?|' . $route->regex() . ')$~x', $requestPath, $matchedRoutes) === false || empty($matchedRoutes) ) { return false; } foreach ($route->getRouteParams() as $param => $attribute) { if (isset($matchedRoutes[$param])) { $route->setRouteParamValue($param, $matchedRoutes[$param]); } } return $matchedRoutes[0] === $requestPath; } }