phpzend-frameworkzend-view

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


I'm looking for a step-by-step explanation on how to go from the normal folder structure on the left where the application folder contains models,views,controllers, to the module-based folder structure on the right where application contains a modules folder which contains the individual modules with their own models,views,controllers.

I say "conversion" because I don't think zend lets us create projects using the module architecture from the start, but if it did, that would be swell and would remove the need to make these folder structure changes manually.

http://img375.imageshack.us/img375/5582/foldersboth.jpg

Here's my experience so far

Half the problem solved. But when I try to view the application, I don't see anything from index/index view. I don't get any errors either, but I see nothing. I suspect that it's because the application doesn't know that the index/index view has moved.

I'm guessing I need to make changes to application.ini or to bootstrap.php or some other location. So what exactly are the steps to get this thing done smoothly and get it working? I'm using the latest ZF 1.10.8. Please start from create a new zend project so there's no confusion on the exact steps.


Solution

  • 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:

    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:

    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.