Davinder Kumar
Davinder Kumar

Reputation: 662

Zend route with unlimited parameters

I am using Zend 1.10. I am trying to create a route for unlimited variables like abc.com/var1/var2/var3 and so on.

Till now i have searched and find out that i can add route for each variable like

$route = new Zend_Controller_Router_Route(
                '/emaillog/:var1',
                array(
                        'controller' => 'emaillog', // The controller to point to.
                        'action'     => 'index',  // The action to point to, in said Controller.
                        ':var1' =>null  //default value if param is not passed
                )
        );
$frontController->getRouter()->addRoute('emaillogWithVar1', $route);

and for second variable,

$route = new Zend_Controller_Router_Route(
                '/emaillog/:var1/:var2',
                array(
                        'controller' => 'emaillog', // The controller to point to.
                        'action'     => 'index',  // The action to point to, in said Controller.
                        ':var1' =>null,  //default value if param is not passed
                        ':var2' =>null  //default value if param is not passed
                )
        );
        $frontController->getRouter()->addRoute('emaillogWithVar2', $route);

But the work i going to do, can contain 1-∞ infinite variables.

So i want to have once route for unlimited variables.

Any help will be appreciated!

Upvotes: 0

Views: 83

Answers (1)

mega6382
mega6382

Reputation: 9396

There is a way to get infinite params. For that you don't have to declare them.

Lest say the url is index/test/p1/p2/p3/p4/p5, now if you try the following inside IndexController:

public function testAction()
{
    var_dump($this->getRequest());
}

You will get a dump of an instance of Zend_Controller_Request_Http, in that dump, you will see, 2 properties, _params & _pathInfo, Like:

protected '_pathInfo' => string '/index/test/p1/p2/p3/p4/p5' (length=26)
protected '_params' => 
array (size=5)
    'controller' => string 'index' (length=5)
    'action' => string 'test' (length=4)
    'p1' => string 'p2' (length=2)
    'p3' => string 'p4' (length=2)
    'module' => string 'default' (length=7)

1st method: Now in _params, they will occur as key => value pairs, as long as they are even, the last odd param will be ignored. You can get these by(for example):

$params = $this->getRequest()->getParams();
unset($params['controller']);
unset($params['action']);
unset($params['module']);
$params = array_merge(array_keys($params), array_values($params));
var_dump($params);

Output:

array (size=4)
  0 => string 'p1' (length=2)
  1 => string 'p3' (length=2)
  2 => string 'p2' (length=2)
  3 => string 'p4' (length=2)

2nd Method: OR you can use _pathinfo to get the params using explode, like:

$path = $this->getRequest()->getPathinfo();
$params = explode('/', $path);
unset($params[0]);
unset($params[1]);
unset($params[2]);
var_dump($params);

Output:

array (size=5)
  3 => string 'p1' (length=2)
  4 => string 'p2' (length=2)
  5 => string 'p3' (length=2)
  6 => string 'p4' (length=2)
  7 => string 'p5' (length=2)

Upvotes: 1

Related Questions