/**
  * 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);
 }