ZF-6458: Zend_Application_Resource_Frontcontroller overwrites multiple controller directories

Issue Type: Bug Created: 2009-04-28T18:55:25.000+0000 Last Updated: 2009-05-06T05:50:56.000+0000 Status: Resolved Fix version(s): - 1.8.1 (12/May/09)

Reporter: Ken Stanley (dohpaz) Assignee: Matthew Weier O'Phinney (matthew) Tags: - Zend_Application

Related issues: Attachments: - patch


This is in reference to ticket ZF-6244, which I believe was misunderstood. Because Zend_Controller_Front::setControllerDirectory() clears any existing controller directories every time that it is invoked, using the foreach loop in Zend_Application_Resource_Frontcontroller:54, only the last directory in the array of controller directories will remain set, regardless of the uniqueness of the module => directory pairs you pass in. The solution that I see for this issue is to remove the foreach loop in the front controller resource, and just pass in the array (setControllerDirectory() accepts an array by default). I am using revision 15243 (1.8.0dev)


Posted by Ken Stanley (dohpaz) on 2009-04-28T18:58:37.000+0000

This is a patch removes the condition check for if $value is a string and just passes $value to Zend_Controller_Front::setControllerDirectory().

Posted by Matthew Weier O'Phinney (matthew) on 2009-04-29T05:56:16.000+0000

What's odd is that setControllerDirectory() is not written such that it should overwrite -- and yet I just verified that it does.

As a workaround until this is fixed, I'd recommend keeping your modules under a common directory, and using the moduleDirectory configuration key instead of controllerDirectory.

Posted by Ken Stanley (dohpaz) on 2009-04-29T06:09:50.000+0000

I was mistaken when I first made the report. It's not in Zend_Controller_Front::setControllerDirectory(). It's actually in Zend_Controller_Dispatcher_Standard::setControllerDirectory(). It's the first line of the method, and it assigns an empty array to $this->_controllerDirectory. Apologies for the confusion. :)

Posted by Mark Lindeman (mightymax) on 2009-05-06T01:18:25.000+0000

IMHO this is a very high priority bug: for existing ZF based applications with multiple modules it's nearly impossible to upgrade to the 1.8 release.

To make the problem even more clear: using the new Zend_Application, if you create an .ini file with these lines:

[production] includePaths.library = APPLICATION_PATH "/../library" bootstrap.path = APPLICATION_PATH "/Bootstrap.php" bootstrap.class = "Bootstrap" resources.frontController.controllerDirectory.default = APPLICATION_PATH "/default/controllers" resources.frontController.controllerDirectory.module1 = APPLICATION_PATH "/module1/controllers"

than the Application_Resource_Frontcontroller invokes the Frontcontroller's setControllerDirectory which in turn invokes the Dispatcher method setControllerDirectory which resets the internal __controllerDirectory_ array each time it's called.

The solution is really simple: Application_Resource_Frontcontroller should use addControllerDirectory in stead of setControllerDirectory. For your convenience I've attached a patch file.

Posted by Matthew Weier O'Phinney (matthew) on 2009-05-06T05:50:54.000+0000

Fixed in trunk and 1.8 release branch.

Have you found an issue?

See the Overview section for more details.


© 2006-2018 by Zend, a Rogue Wave Company. Made with by awesome contributors.

This website is built using zend-expressive and it runs on PHP 7.