ZF-6404: Minor improvement to Zend_Controller_Router_Route_* classes to make them suitable for using in Zend_Controller_Router_Route_Chain
Description
Currently (version 1.8) it's impossible to use assemble when using route Chain without side-effects. Chain's assemble method checks what variables each chain node injected into assembled url:
public function assemble($data = array(), $reset = false, $encode = false)
{
$value = '';
foreach ($this->_routes as $key => $route) {
if ($key > 0) {
$value .= $this->_separators[$key];
}
$value .= $route->assemble($data, $reset, $encode);
// Check begins here vvvvv
if (method_exists($route, 'getVariables')) {
$variables = $route->getVariables();
foreach ($variables as $variable) {
$data[$variable] = null;
}
}
}
return $value;
}
Note for getVariables method. Everything seemed to be great for now BUT only Hostname route seemed to implement this method so when we trying to chain few Zend_Controller_Router_Route objects together with last of them having '*' in pattern, or chaining Zend_Controller_Router_Route with Zend_Controller_Router_Module we have all of our params wich was already in url from first Route elements doubled by the last one:
$lngRoute = new Zend_Controller_Router_Route(
':language',
array(
'language' => 'none',
),
array(
'language' => '[a-z]{2}'
)
);
// App_Controller_Router_Route_Module -- workaroud to ZF-6399
$route_module = new App_Controller_Router_Route_Module(
array(),
$dispatcher,
$request
);
$chain = new Zend_Controller_Router_Route_Chain();
$chain->chain($lngRoute);
$chain->chain($route_module);
$router->addRoute('default', $chain);
...........
$router->assemble(array('language' => 'en', 'module' => 'user', 'controller' => 'register', 'action' => 'action'));
// EXPECTED: /en/user/register/action
// CURRENT OUTPUT: /en/user/register/action/language/en
That happens because Zend_Controller_Router_Route DO NOT define getVariables method.
so it seemed to me that all Rute_* classes should be reworked with getVariables method added (more of it: it would be great to add this method to Abstract Route class).
Comments
Posted by Matthew Weier O'Phinney (matthew) on 2009-04-24T06:04:22.000+0000
Assigning to dasprid