options['_name']) ? $route->options['_name'] : $route->getName(); $output[] = [$name, $route->template, json_encode($route->defaults)]; } $this->helper('table')->output($output); $this->out(); } /** * Checks a url for the route that will be applied. * * @param string $url The URL to parse * @return bool Success */ public function check($url) { try { $route = Router::parse($url); $name = null; foreach (Router::routes() as $r) { if ($r->match($route)) { $name = isset($r->options['_name']) ? $r->options['_name'] : $r->getName(); break; } } unset($route['_matchedRoute']); $output = [ ['Route name', 'URI template', 'Defaults'], [$name, $url, json_encode($route)] ]; $this->helper('table')->output($output); $this->out(); } catch (MissingRouteException $e) { $this->warn("'$url' did not match any routes."); $this->out(); return false; } return true; } /** * Generate a URL based on a set of parameters * * Takes variadic arguments of key/value pairs. * @return bool Success */ public function generate() { try { $args = $this->_splitArgs($this->args); $url = Router::url($args); $this->out("> $url"); $this->out(); } catch (MissingRouteException $e) { $this->err("The provided parameters do not match any routes."); $this->out(); return false; } return true; } /** * Get the option parser. * * @return \Cake\Console\ConsoleOptionParser */ public function getOptionParser() { $parser = parent::getOptionParser(); $parser->setDescription( 'Get the list of routes connected in this application. ' . 'This tool also lets you test URL generation and URL parsing.' )->addSubcommand('check', [ 'help' => 'Check a URL string against the routes. ' . 'Will output the routing parameters the route resolves to.' ])->addSubcommand('generate', [ 'help' => 'Check a routing array against the routes. ' . "Will output the URL if there is a match.\n\n" . "Routing parameters should be supplied in a key:value format. " . "For example `controller:Articles action:view 2`" ]); return $parser; } /** * Split the CLI arguments into a hash. * * @param array $args The arguments to split. * @return array */ protected function _splitArgs($args) { $out = []; foreach ($args as $arg) { if (strpos($arg, ':') !== false) { list($key, $value) = explode(':', $arg); if (in_array($value, ['true', 'false'])) { $value = $value === 'true'; } $out[$key] = $value; } else { $out[] = $arg; } } return $out; } }