Add a optional parameter in default Zend route
I want to change the default route on my application to use an optional parameter via Bootstrap.php, not in the application.ini. I am having trouble setting up all "escape" routes, I even don't know If I need to set up several routes or if I can do with only one!
The route must be something like
":module/:area/:controller/:action"
where :area is o开发者_StackOverflow中文版ptional and defaulted to "public"
So in any access to http://www.example.com/my_module/my_controller/my_action I can get via a FC plugin the following:
$request->getParam('area') = "public"
And in http://www.example.com/my_module/my_area/my_controller/my_action I get:
$request->getParam('area') = "my_area"
The main trouble is creating all routes so it escapes to default module, index controller and index action in case those are not passed too and loading http://www.example.com/ returns same as http://www.example.com/default/public/index/index.
And I want to use URL Helper to generate internal URL´s and it respects the correct assembly on this new Default Route.
Edit: I figured that default Route comes with a fail-safe for the module, if it don't exist it defaults to the controller, but how to mimic similar behavior for other parts of the URL and the module itself when creating it in the Bootstrap.
Can anybody give me some light or suggest where can I find an working example ?
You can extend Zend_Controller_Router_Rewrite
and change the default router settings and URL assembling, and then use ->setRouter()
on your Zend_Controller_Front to use your new router instance instead of the default. Search for class Zend_Controller_Router_Rewrite
and learn it before doing so.
The solution was indeed to extend Zend_Controller_Router_Route_Abstract
and create a new Route handler to go through the url, verify the existence of modules, areas, controllers and actions to build a full functional url or dispatch to the error controller.
The heavy work is done between the match()
and assemble()
methods and I used as reference the Zend class Zend_Controller_Router_Route_Module
tht do similar task for the module, but instead of verifying if module exists with the dispatcher I created a whitelist of allowed areas, if it fails to match, it considers that that path part is the controller, the next the action and further parts are parameters.
It worked like magic!
精彩评论