/** * Aura\Routerを使ったActionのResolver * * URLHandlerが難しい、という人向け * * @param Ethna_Event_Forward $event */ public static function resolveAction(Ethna_Event_ResolveActionName $event) { $router = self::$router; if (!$router) { $router_factory = new RouterFactory(); self::$router = $router = $router_factory->newInstance(); $base_dir = $event->getController()->getDirectory("app"); // MEMO(chobie): scopeを限定させてるだけ $path = $base_dir . DIRECTORY_SEPARATOR . "routes.php"; if (is_file($path)) { call_user_func(function (Aura\Router\Router $router, $path) { require $path; }, $router, $path); } $path = $base_dir . DIRECTORY_SEPARATOR . "routes_overrides.php"; if (is_file($path)) { call_user_func(function (Aura\Router\Router $router, $path) { require $path; }, $router, $path); } } $path = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH); $route = $router->match($path, $_SERVER); if ($route) { $ignore = array("controller", "action"); foreach ($route->params as $key => $value) { if (in_array($key, $ignore)) { continue; } if ($_SERVER['REQUEST_METHOD'] == "POST") { $_POST[$key] = $value; } else { if ($_SERVER['REQUEST_METHOD'] == "GET") { $_GET[$key] = $value; } } } $event->setActionName($route->params['action']); } else { $event->setActionName($event->getFallbackActionName()); } $event->stopPropagation(); }
/** * UrlHandlerもしくはFormベースのAction名解決 * * EthnaのDefault実装 * * @param Ethna_Event_Forward $event */ public static function resolveAction(Ethna_Event_ResolveActionName $event) { $controller = $event->getController(); if (isset($_SERVER['REQUEST_METHOD']) == false) { if (PHP_SAPI == "cli" && $event->getDefaultActionName()) { $event->setActionName($event->getDefaultActionName()); return; } return null; } $url_handler = $controller->getUrlHandler(); if ($_SERVER['REQUEST_METHOD'] == "GET") { $tmp_vars = $_GET; } else { if ($_SERVER['REQUEST_METHOD'] == "POST") { $tmp_vars = $_POST; } } if (empty($_SERVER['URL_HANDLER']) == false) { $tmp_vars['__url_handler__'] = $_SERVER['URL_HANDLER']; $tmp_vars['__url_info__'] = isset($_SERVER['PATH_INFO']) ? $_SERVER['PATH_INFO'] : null; $tmp_vars = $url_handler->requestToAction($tmp_vars); if ($_SERVER['REQUEST_METHOD'] == "GET") { $_GET = array_merge($_GET, $tmp_vars); } else { if ($_SERVER['REQUEST_METHOD'] == "POST") { $_POST = array_merge($_POST, $tmp_vars); } } $_REQUEST = array_merge($_REQUEST, $tmp_vars); } if (strcasecmp($_SERVER['REQUEST_METHOD'], 'post') == 0) { $http_vars = $_POST; } else { $http_vars = $_GET; } // フォーム値からリクエストされたアクション名を取得する $action_name = $sub_action_name = null; foreach ($http_vars as $name => $value) { if ($value == "" || strncmp($name, 'action_', 7) != 0) { continue; } $tmp = substr($name, 7); // type="image"対応 if (preg_match('/_x$/', $name) || preg_match('/_y$/', $name)) { $tmp = substr($tmp, 0, strlen($tmp) - 2); } // value="dummy"となっているものは優先度を下げる if ($value == "dummy") { $sub_action_name = $tmp; } else { $action_name = $tmp; } } if ($action_name == null) { $action_name = $sub_action_name; } $controller->getLogger()->log(LOG_DEBUG, 'form_action_name[%s]', $action_name); $default_action_name = $event->getDefaultActionName(); // フォームからの指定が無い場合はエントリポイントに指定されたデフォルト値を利用する if ($action_name == "" && count($event->getDefaultActionName()) > 0) { $tmp = is_array($default_action_name) ? $default_action_name[0] : $default_action_name; if ($tmp[strlen($tmp) - 1] == '*') { $tmp = substr($tmp, 0, -1); } $event->getController()->getLogger()->log(LOG_DEBUG, '-> default_action_name[%s]', $tmp); $action_name = $tmp; } // エントリポイントに配列が指定されている場合は指定以外のアクション名は拒否する if (is_array($default_action_name)) { if ($event->getController()->_isAcceptableActionName($action_name, $default_action_name) == false) { // 指定以外のアクション名で合った場合は$fallback_action_name(or デフォルト) $tmp = $event->getFallbackActionName() != "" ? $event->getFallbackActionName() : $default_action_name[0]; if ($tmp[strlen($tmp) - 1] == '*') { $tmp = substr($tmp, 0, -1); } $event->getController()->logger->log(LOG_DEBUG, '-> fallback_action_name[%s]', $tmp); $action_name = $tmp; } } $event->setActionName($action_name); }