Step-by-step conversion to module-based folder structure for zend project

Here's what I did to try and follow your example (from scratch):

$ zf create project .
$ zf create module product
$ zf create module default

I then moved controllers, models and views from ./application to ./application/modules.

Next I opened up application.ini, and replaced this line (which tells ZF where to find controllers in a non-modular app):

resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"

with:

resources.frontController.moduleDirectory = APPLICATION_PATH "/modules"

which tells ZF where to find modules.

I then manually created an index controller for the product module so I could test that this worked, which it did. I then hit http://localhost/index/index to see if the default module index action still worked, it didn't, instead I got the error:

Fatal error: Uncaught exception 'Zend_Controller_Dispatcher_Exception' with message 'Invalid controller class ("Default_ErrorController")' in ...

it sounds like this is where you got to.

There are two ways to fix this error, and the documentation is quite misleading (possibly even wrong). It states:

Note that in the default module, controllers do not need a namespace prefix. Thus, in the example above, the controllers in the default module do not need a prefix of 'Default_' -- they are simply dispatched according to their base controller name: 'IndexController' and 'FooController'. A namespace prefix is used in all other modules, however.

but clearly the error above indicates that ZF is looking for an ErrorController class called Default_ErrorController. To fix this you can do one of two things:

  • Change the class names of application/modules/default/controllers/IndexController.php from IndexController to Default_IndexController, and application/modules/default/controllers/ErrorController.php from ErrorController to Default_ErrorController
  • Or remove this line:

    resources.frontController.params.prefixDefaultModule = "1"

from application.ini. This line tells ZF to use the 'Default_' namespace on the default module classes, so without it it will just look for 'IndexController'. I went for the latter option, and http://localhost/index/index then worked as expected.

In your case you said you got a blank page at /index/index, which means either:

  • You have a different problem
  • You have errors disabled in development mode
  • You are running in production mode where errors are disabled by default (most likely)

to check the last option, open application.ini and temporarily change phpSettings.display_errors from 0 to 1 in the production section. If you then get the same error I had above, hopefully you'll be able to get everything working.

I hope this is helpful. All I can say is don't get too reliant on Zend_Tool for management of your app - it can't do everything, and often it's easier to manually move things around than to try and do everything via. the zf command; particularly when restructuring.