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
toDefault_IndexController
, and application/modules/default/controllers/ErrorController.php fromErrorController
toDefault_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.