/** * Сохраняем имя маршрута. * @param string $routeName - имя маршрута * @param mixed $val - сериализируемое значение */ public function setRouteName($routeName) { if (BaseService::isNotString($routeName)) { throw new FrmworkExcep\InvalidArgumentException(self::$msgForInvalidArgExcp, Request::class, __METHOD__, '$routeName', 'string'); } $this->addProperty('route', $routeName); FrameworkRegistry::setRequest(self::$instance); }
/** * Сохраняем таблицу маршрутизации в реестре FrameworkRegistry (при первом обращении к RouteMapLoader). * Затем вызывается соответствующее текущим параметрам Request действие контролера. */ public static function main() { try { // считываем таблицу маршрутизации (при первом обращении) // и сохраняем ее в FrameworkRegistry: RouteMapLoader::getInstance()->initialize(); // создаем в соотвествии с заданным маршрутом(Request) экземпляр контролера, // затем посредством метода run вызывается соотвующее действие: while ($controller = FrameworkRegistry::getRouting()->getController(Request::getInstance())) { $controller->run(); } } catch (FrameworkException $frmExcep) { $frmExcep->redirectToExcepPage(); } }
/** * Сохраняем экземпляр выполненного контролера в FrameworkRegistry */ protected final function saveController() { if (!$this->isStoredController) { FrameworkRegistry::setExecutedController($this); } $this->isStoredController = true; }
/** * Вносим в request параметры для действия контролера маршрута, на который выполняется редирект. * * @param array $arrParams параметры из нового маршрута */ public function addParametersForRedirectRoute($arrParams) { if (!is_array($arrParams)) { throw new FrmworkExcep\InvalidArgumentException(self::$msgForInvalidArgExcp, Routing::class, __METHOD__, '$arrParams', 'array'); } if (!$this->request) { $this->request = Request::getInstance(); } $this->request->removeAllParameters(); // удаляем из request текущие параметры $this->removeAllParametersForAction(); // обнуляем $this->paramsAction foreach ($arrParams as $key => $value) { $this->request->addParameter($key, $value); //вносим в request параметры } FrameworkRegistry::setRouting($this); }
/** * Считываем глобальные настройки и таблицу маршрутизации из config.xml, * полученные данные помещаем в реестр FrameworkRegistry. * * Note: Таблица маршрутизации сохраняется в экземпляре RouteMap, который * в свою очередь сохраняется в FrameworkRegistry. */ private function getSettingsFromConfigFile() { $nameCfgFile = 'config.xml'; $cfgPathFile = '..' . DIRECTORY_SEPARATOR . 'framework' . DIRECTORY_SEPARATOR . 'app' . DIRECTORY_SEPARATOR . 'config' . DIRECTORY_SEPARATOR . $nameCfgFile; if (!file_exists($cfgPathFile)) { throw new FrmworkExcep\FileNotFoundException('Конфиг. файлa "' . $nameCfgFile . '" нет.', RouteMapLoader::class, __METHOD__); } $settings = @SimpleXml_load_file($cfgPathFile); $host = (string) $settings->host; FrameworkRegistry::setHost($host); // сохраняем наименование хоста $baseUrl = (string) $settings->baseUrl; FrameworkRegistry::setBaseUrl($baseUrl); // сохраняем путь к index.php $connDB = (string) $settings->connDB; FrameworkRegistry::setConnStringDB($connDB); // сохраняем путь к БД $msgForException = 'Ошибка в "' . $nameCfgFile . '".'; if (!$host || !$baseUrl) { throw new FrmworkExcep\FileFormatException($msgForException, RouteMapLoader::class, __METHOD__, 'Проверьте теги: host, baseUrl.'); } FrameworkRegistry::setStartRoute((string) $settings->startRoute); // сохраняем маршрут к стартовой странице приложения FrameworkRegistry::setExcepPage((string) $settings->excepPage); // сохраняем путь к странице с описанием возникших исключений $routing = new Routing(new RouteMapManager()); //@var Routing агрегирует экземпляр RouteMap, в который сохраняем маршруты $strStatusVal = ''; //@var string результат выполнения действия ('RES_ACT_DEF', 'RES_ACT_OK'...). if (!$settings->default) { throw new FrmworkExcep\FileFormatException($msgForException, RouteMapLoader::class, __METHOD__, 'Проверьте тег default.'); } // считываем и сохраняем данные о default-странице фраймворка: foreach ($settings->default as $eachDef) { if (!$eachDef->action) { throw new FrmworkExcep\FileFormatException($msgForException, RouteMapLoader::class, __METHOD__, 'Проверьте тег default\\action.'); } $routing->addActionNameToRoute('default', (string) $eachDef->action); if (!$eachDef->view) { throw new FrmworkExcep\FileFormatException($msgForException, RouteMapLoader::class, __METHOD__, 'Проверьте тег default\\view.'); } $routing->addViewToRoute('default', 0, (string) $eachDef->view); } if (!$settings->route) { throw new FrmworkExcep\FileFormatException($msgForException, RouteMapLoader::class, __METHOD__, 'Проверьте теги route.'); } // считываем и сохраняем данные о маршрутах (route): foreach ($settings->route as $eachRoute) { if (!$eachRoute['name']) { throw new FrmworkExcep\FileFormatException($msgForException, RouteMapLoader::class, __METHOD__, 'Проверьте атрибут name тегa route.'); } $nameRoute = (string) $eachRoute['name']; //@var string наименование маршрута. if (!$eachRoute->controller) { throw new FrmworkExcep\FileFormatException($msgForException, RouteMapLoader::class, __METHOD__, 'Проверьте тег controller.'); } if (!$eachRoute->controller['name']) { throw new FrmworkExcep\FileFormatException($msgForException, RouteMapLoader::class, __METHOD__, 'Проверьте атрибут name тегa controller.'); } $nameController = (string) $eachRoute->controller['name']; //@var string наименование контроллера. if (!$eachRoute->action) { throw new FrmworkExcep\FileFormatException($msgForException, RouteMapLoader::class, __METHOD__, 'Проверьте тег action.'); } if (!$eachRoute->action['name']) { throw new FrmworkExcep\FileFormatException($msgForException, RouteMapLoader::class, __METHOD__, 'Проверьте атрибут name тегa action.'); } $nameAction = (string) $eachRoute->action['name']; //@var string наименование действия. foreach ($eachRoute->action->param as $eachParam) { $routing->addParamToAction($nameRoute, (string) $eachParam, trim($eachParam['limitationrule']), trim($eachParam['defaultvalue'])); // сохранение в ControllerMap параметров действия. } $routing->addControllerNameToRoute($nameRoute, $nameController); $routing->addActionNameToRoute($nameRoute, $nameAction); if ($eachRoute->view) { $strStatusVal = ''; // считываем и сохраняем данные о представлениях и соотв. им результатах выполнения действий контролера: foreach ($eachRoute->view as $eachView) { $nameView = (string) $eachView; //@var string наименование представления. $strStatusVal = trim($eachView['status']); $routing->addViewToRoute($nameRoute, ControllerBase::statuses($strStatusVal), $nameView); // сохраняем текущий маршрут, результат выполения действия и соотв. представление } } $strStatusVal = ''; if ($eachRoute->status) { $strStatusVal = trim($eachRoute->status['value']); foreach ($eachRoute->status->redirect as $eachRedirect) { // считываем и сохраняем данные о форвард-маршруте, который будет вызван // из текущего маршрута, в случае установки соотв. статуса в действии контролера: $routing->addRedirectToRoute($nameRoute, ControllerBase::statuses($strStatusVal), (string) $eachRedirect); } } } //foreach ( $settings->cmd as $eachController ) { FrameworkRegistry::setRouteMap($routing->getRouteMapManager()); // сохраняем таблицу маршрутизации в реестре FrameworkRegistry }
/** * Редирект на страницу с описанием сгенерированого исключения. */ public function redirectToExcepPage() { $this->redirect(FrameworkRegistry::getExcepPage()); }