-- SHY <[EMAIL PROTECTED]> wrote
(on Friday, 26 January 2007, 03:43 AM +0100):
<snip>
> i was using the stable 0.7.0 release and i realized it was time for an update.
> so i checked out the latest files from the svn repository and took a look at
> the new files and documentation. after a while, i revised my index.php with
> the
> following:
>
> Zend::loadClass( 'Zend_Controller_ModuleRouter' );
> Zend::loadClass( 'Zend_Controller_ModuleDispatcher' );
When the OP asked the question, these changes weren't in the repository
yet. He'ssince updated me that everything was working for him.
<snip>
> $frontController->setControllerDirectory( array( 'default' => './application/
> controllers',
> 'admin' => './application/
> controllers/admin' ) );
> $frontController->setRouter( new Zend_Controller_ModuleRouter() );
> $frontController->setDispatcher( new Zend_Controller_ModuleDispatcher() );
>
> at this point, routes for '/admin' AND '/articles' worked as expected. BUT the
> route for '/' got me a weird error of not being able to FIND
> IndexController.php file:
>
> Fatal error : Uncaught exception 'Zend_Exception' with message 'File
> "IndexController.php" was not found.
>
> after some looking, i figured out that the pretty easy way to solve this for
> good would be to modify the set_include_path, so it would include a directory
> to default module controllers:
>
> set_include_path( '.' . PATH_SEPARATOR . '../ZendFramework/library'
> . PATH_SEPARATOR . './application/controller/'
> . PATH_SEPARATOR . get_include_path() );
>
> but i somehow felt this wasnt very pragmatic so i kept diggin in the core
> files
> and classes and finally came to an interesting conclusion (at least for me):
>
> In the dispatch() method of the Zend_Controller_Dispatcher class, $className
> for the '/' route is obviously empty, so the _getDefaultControllerName()
> method
> is called, which is actually overriden in Zend_Controller_ModuleDispatcher,
> where it ends up with Null dispatcherdirectory array (_curDirectory) due to
> invalid moduleName (which is actually valid only in the case of '/admin'
> route,
> as the 'default' module is clearly considered invalid).
> as the dispatcher-directory array is null, the following call to loadClass
> method in Zend_Controller_Dispatcher's dispatch() method fails with the
> above-mentioned error.
>
> i even found this easy to fix, by changing a small piece of code in
> ModuleDispatcher.php:
>
> change this (around line 287):
>
> } elseif ($useGlobalDefault && $validModule) {
> $dirs = $this->getControllerDirectory();
> $this->_curDirectory = $dirs['default'];
> }
>
> to this:
>
> } else { //if ($useGlobalDefault && $validModule) {
> $dirs = $this->getControllerDirectory();
> $this->_curDirectory = $dirs['default'];
> }
>
> and now the whole thing works as originally expected.
> im not sure if this fix is actually the correct one, so ill stick with the
> set_include_path solution for now.
Nope, this was it. Thanks for the detailed report -- committed in
revision 3006.
>
> 2007/1/23, Philip Iezzi <[EMAIL PROTECTED]>:
>
> some additions...
> Even after Matthew's corrections in revision 2958, the new named module
> support doesn't seem to work as it is supposed to (in my opinion).
>
> $controller = Zend_Controller_Front::getInstance();
> $controller->setParam('useModules', true);
> $controller->setControllerDirectory('../application/controllers');
> $controller->addControllerDirectory('../application/controllers/Admin',
> 'admin');
>
> If I call any of the following: "/" or "/index" or "/index/index" or even
> IndexControllers in my modules, e.g. "/admin/" or "/admin/index", I always
> get the following exception:
>
> Fatal error: Uncaught exception 'Zend_Exception' with message 'File
> "IndexController.php" was not found.' in D:\frameworks\zend\library\
> Zend.php:175
> Stack trace:
> #0 D:\frameworks\zend\library\Zend.php(103): Zend::loadFile
> ('IndexController...', Array, true)
> #1 D:\frameworks\zend\library\Zend\Controller\Dispatcher.php(585):
> Zend::loadClass('IndexController', NULL)
> #2 D:\frameworks\zend\library\Zend\Controller\Front.php(731):
> Zend_Controller_Dispatcher->dispatch(Object(Zend_Controller_Request_Http),
> Object(Zend_Controller_Response_Http))
> #3 D:\vhosts\projects\airpane\htdocs\index.php(82):
> Zend_Controller_Front->
> dispatch()
> #4 {main}
> thrown in D:\frameworks\zend\library\Zend.php on line 175
>
> It will find all other controllers, so e.g. "/index/customers" is fine and
> calls the CustomersController in "../application/controllers/
> CustomersController.php".
> Another sample: "/admin/mailing" will correctly call the
> Admin_MailingController in "../application/controllers/Admin/
> MailingController.php".
> I tried to add a "Default_|Index_" prefix to all non-modular controller
> class names - no success!!
>
> If I reactivate my manually defined router, everything works fine!...
>
> $mainRoute = new
> Zend_Controller_Router_Route(':module/:controller/:action/
> *', array('module' => 'index', 'controller' => 'index', 'action' =>
> 'index'));
> $router = new Zend_Controller_RewriteRouter();
> $router->addRoute('mainroute', $mainRoute);
> $controller->setRouter($router);
>
> Before your change last night, I was able to use module support with the
> default route by just specifying $controller->setParam('useModules',
> true);
> And besides, with my own router it works though, but it's a bit annoying
> to
> call "/index/index/action" instead of "/index/action" ("index" was never
> defined as a module and is not found in a module directory. Anything that
> doesn't match a named module should be found in the default controller
> directory set in $controller->setControllerDirectory('../application/
> controllers'); and treated as a controller.
> Correct me if I'm wrong.
>
> take care
> Philip
>
>
--
Matthew Weier O'Phinney
PHP Developer | [EMAIL PROTECTED]
Zend - The PHP Company | http://www.zend.com/