/** * Generates the routing files from the controllers. * * @return bool Returns true * @throws \Exception */ public static function generateRoutes() : bool { $controllersList = scandir(Settings::getControllersPath()); foreach ($controllersList as $controllerFile) { $module = explode('_', $controllerFile)[0]; if ($module && $controllerFile != '..' && $controllerFile != '.') { $routesRootFile = Settings::getRoutesFile(); $routesRoot = file_exists($routesRootFile) ? YAML::load($routesRootFile) : array(); $routesRootModuleMatch = false; foreach ($routesRoot as $route) { if (isset($route['module'])) { if ($route['module'] == $module) { $routesRootModuleMatch = true; } } } if ($routesRootModuleMatch == false) { $newRoute = array('module' => $module, 'route' => sprintf('^%s/', $module), 'name' => $module); array_unshift($routesRoot, $newRoute); } $routesRootYaml = YAML::dump($routesRoot); file_put_contents($routesRootFile, $routesRootYaml); $includeFile = sprintf('%s/%s', Settings::getControllersPath(), $controllerFile); include $includeFile; $objecReflection = new \ReflectionClass(ucfirst($module)); $publicMethodsList = $objecReflection->getMethods(\ReflectionMethod::IS_PUBLIC); $moduleRoutesFile = sprintf('%s/%s_routes.yml', Settings::getRoutesPath(), $module); if (file_exists($moduleRoutesFile)) { $moduleRoutesList = YAML::load($moduleRoutesFile); } else { $moduleRoutesList = array(); } foreach ($publicMethodsList as $method) { $methodParameters = $method->getParameters(); $paramsPattern = array(); $isInRoutesList = false; foreach ($methodParameters as $param) { $paramsPattern[] = sprintf('(?P<%s>\\w+)', $param->getName()); } foreach ($moduleRoutesList as $key => $route) { if (isset($route['name'])) { if ($route['name'] == $method->getName()) { $isInRoutesList = true; if (sizeof($paramsPattern)) { $moduleRoutesList[$key]['route'] = sprintf('^%s/%s$', $method->getName(), implode('/', $paramsPattern)); } else { $moduleRoutesList[$key]['route'] = sprintf('^%s$', $method->getName()); } } } } if (!$isInRoutesList) { if (sizeof($paramsPattern)) { $moduleRoutesList[] = array('route' => sprintf('^%s/%s$', $method->getName(), implode('/', $paramsPattern)), 'controller' => $method->getName(), 'name' => $method->getName()); } else { $moduleRoutesList[] = array('route' => sprintf('^%s$', $method->getName()), 'controller' => $method->getName(), 'name' => $method->getName()); } } } $moduleRoutesYaml = YAML::dump($moduleRoutesList); file_put_contents($moduleRoutesFile, $moduleRoutesYaml); unset($objecReflection); } } return true; }