0

I have following routes defined in Phalcon:

$router->add('/products', array(
    'module' => 'products',
    'namespace'=>'MyNameSpace\Products\Controllers\\',
    'controller'=>'index',
    'action' => 'index'
));

$router->add('/products/:params', array(
    'module' => 'products',
    'namespace'=>'MyNameSpace\Products\Controllers\\',
    'controller'=>'index',
    'action' => 'index',
    'params' => 1
));

$router->add('/products/:action', array(
    'module' => 'products',
    'namespace'=>'MyNameSpace\Products\Controllers\\',
    'controller'=>'index',
    'action' => 1
));


$router->add('/products/:action/:params', array(
    'module' => 'products',
    'namespace'=>'MyNameSpace\Products\Controllers\\',
    'controller'=>'index',
    'action' => 1,
    'params' => 2
));

And I have urls in following format

http://www.example.com/products/3029-baggrys-oats-2-kg-pack
=> Product detail page, here "3029-baggrys-oats-2-kg-pack" is a parameter

http://www.example.com/products/save-to-wish-list => Here "save-to-wish-list" is action to the controller

Problem The first url is intended to link to product detail page, second url is intended to let user save product to wish list.

But both url matches third route. I know I must be doing something wrong while defining routes. Can anybody point out what will be the better way to tackle this scenario ??

Thanks

WatsMyName
  • 4,240
  • 5
  • 42
  • 73

2 Answers2

0

I suggest doing like

$router->add('/products', array(
    'module' => 'products',
    'namespace'=>'MyNameSpace\Products\Controllers\\',
    'controller'=>'index',
    'action' => 'index'
));

$router->add('/products/params/:params', array(
    'module' => 'products',
    'namespace'=>'MyNameSpace\Products\Controllers\\',
    'controller'=>'index',
    'action' => 'index',
    'params' => 1
));

$router->add('/products/action/:action', array(
    'module' => 'products',
    'namespace'=>'MyNameSpace\Products\Controllers\\',
    'controller'=>'index',
    'action' => 1
));


$router->add('/products/:action/:params', array(
    'module' => 'products',
    'namespace'=>'MyNameSpace\Products\Controllers\\',
    'controller'=>'index',
    'action' => 1,
    'params' => 2
));

Or else you can change method types like GET, POST, PUT, DELETE

$router->addGet('/products', array(
    'module' => 'products',
    'namespace'=>'MyNameSpace\Products\Controllers\\',
    'controller'=>'index',
    'action' => 'index'
));

$router->addPost('/products/:params', array(
    'module' => 'products',
    'namespace'=>'MyNameSpace\Products\Controllers\\',
    'controller'=>'index',
    'action' => 'index',
    'params' => 1
));

$router->addPut('/products/:action', array(
    'module' => 'products',
    'namespace'=>'MyNameSpace\Products\Controllers\\',
    'controller'=>'index',
    'action' => 1
));


$router->addDelete('/products/:action/:params', array(
    'module' => 'products',
    'namespace'=>'MyNameSpace\Products\Controllers\\',
    'controller'=>'index',
    'action' => 1,
    'params' => 2
));
Ankur
  • 496
  • 1
  • 6
  • 11
0

:params is a shortcut that maps to this regex: (/.*)* It's entirely optional. I'm guessing you also have your app set up to auto-add a trailing slash?

The trouble is, there's no shortcut, or even a regex, that can tell the difference between "3029-baggrys-oats-2-kg-pack" as a parameter and "save-to-wish-list" as an action.

Since saving to the wish list is a transient URL - presumably the user would be taken to this URL, your controller would do something, then redirect them on - I suggest you change that URL to something else like /wishlist/save. That will simplify your controllers, and you won't need a custom route.

Quasipickle
  • 4,383
  • 1
  • 31
  • 53