phpzend-frameworkzend-controller-router

Add router modules in Zend


I have this code:

$defaultAdmin = array ('module' => 'admin', 'controller' => 'index', 'action' => 'index' );
$routeAdmin = new Zend_Controller_Router_Route ( 'admin/:controller/:action/*', $defaultAdmin );
$router->addRoute ( 'admin', $routeAdmin );

However, if I get into this url: /admin/ it load the controller on /application/controllers/IndexController.php instead of the one in /application/modules/admin/controllers/IndexController.php

My full bootstrap is this one:

abstract class My_Application_Bootstrap extends Zend_Application_Bootstrap_Bootstrap {
    /**
     * Inicializa las características generales de la aplicación
     *
     * @param $application Zend_Application|Zend_Application_Bootstrap_Bootstrapper         
     * @return void
     */
    public function __construct($application) {
        parent::__construct ( $application );
        $autoloader = $application->getAutoloader ();
        $autoloader->registerNamespace ( 'Busca' );
        $this->_initConfig ();
        $this->_initDb ();
        $this->_initView ();
        $this->_setCache ();
        $this->_setRouter ();
        $this->_setHelpers ();
        $this->_init ();
    }
    /**
     * Método que setea el cache del sistema
     *
     * @return My_Application_Bootstrap
     */
    protected function _setCache() {
        $config = Zend_Registry::get ( 'config' );

        $metadataBack = $config->metadata_cache->frontend->toArray ();
        $metadataFront = $config->metadata_cache->backend->toArray ();

        $memcachedOpts = $config->db_cache->toArray ();

        $memcache = new My_Cache_Backend_Memcached ( $memcachedOpts );
        $metadataCache = Zend_Cache::factory ( 'Core', 'File', $metadataBack, $metadataFront );

        Zend_Registry::set ( 'Cache', $memcache );
        Zend_Registry::set ( 'MetadaCache', $metadataCache );

        My_Model_Table_Abstract::setDefaultMetadataCache ( 'MetadaCache' );
        return $this;
    }
    /**
     * Inicializa la configuración de la aplicación
     *
     * @return My_Application_Bootstrap
     */
    protected function _initConfig() {
        Zend_Registry::set ( 'config', new Zend_Config ( $this->getOptions () ) );
        return $this;
    }
    /**
     * Inicializa la(s) base(s) de datos
     *
     * @return My_Application_Bootstrap
     */
    protected function _initDb() {
        $this->bootstrap ( 'multidb' );
        $resource = $this->getPluginResource ( 'multidb' );
        $databases = Zend_Registry::get ( 'config' )->resources->multidb;
        foreach ( $databases as $name => $adapter ) {
            $db_adapter = $resource->getDb ( $name );
            Zend_Registry::set ( $name, $db_adapter );
        }
        return $this;
    }
    /**
     * Reemplaza la vista Zend_View por My_View
     *
     * @return My_Application_Bootstrap
     */
    protected function _initView() {
        $viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper ( 'viewRenderer' );
        $view = new My_View ();
        $viewRenderer->setView ( $view );
        return $this;
    }
    /**
     * Método que setea el router general del sitio
     * Todas las peticiones irán al controlador default, con excepción de las de
     * administración.
     *
     * @return My_Application_Bootstrap
     */
    protected function _setRouter() {
        $front = Zend_Controller_Front::getInstance ();
        $router = $front->getRouter ();
        /*
         * Router para entidades
         */
        $defaultSection = array ('module' => 'default', 'controller' => 'index', 'action' => 'section', 'sectionAction' => null, 'section' => null, 'id' => null, 'title' => null );
        $requiredSection = array ('id' => '\d+' );
        $routeSection = new Zend_Controller_Router_Route ( ':section/:sectionAction/:id/:title/*', $defaultSection, $requiredSection );
        $router->addRoute ( 'section', $routeSection );
        /*
         * Router para entidades sin ID
         */
        $defaultSection = array ('module' => 'default', 'controller' => 'index', 'action' => 'section', 'sectionAction' => null, 'section' => null );
        $routeSection = new Zend_Controller_Router_Route ( ':section/:sectionAction/*', $defaultSection, $requiredSection );
        $router->addRoute ( 'section', $routeSection );
        /*
         * Router para listados
         */
        $defaultList = array ('module' => 'default', 'controller' => 'index', 'action' => 'list', 'section' => null );
        $routeList = new Zend_Controller_Router_Route ( ':section/listar/*', $defaultList );
        $router->addRoute ( 'listados', $routeList );
        /*
         * Router para administración
         */
        $defaultAdmin = array ('module' => 'admin', 'controller' => 'index', 'action' => 'index' );
        $routeAdmin = new Zend_Controller_Router_Route ( 'admin/:controller/:action/*', $defaultAdmin );
        $router->addRoute ( 'admin', $routeAdmin );
        return $this;
    }
    /**
     * Configuración de los helpers del sistema
     *
     * @return My_Application_Bootstrap
     */
    protected function _setHelpers() {
        $prefix = 'My_Controller_Action_Helpers';
        Zend_Controller_Action_HelperBroker::addPrefix ( $prefix );
        Zend_Controller_Action_HelperBroker::addPath ( APPLICATION_PATH . '/controllers/helpers', 'My_Controller_Action_Helper' );
        return $this;
    }
    /**
     * Para usar en los hijos en vez del constructor
     */
    protected function _init() {

    }
}

Solution

  • Create a new directory in application folder name 'modules/default' , cut paste your 'application/controllers' inside it . Then make sure your application.ini have

    resources.frontController.moduleDirectory = APPLICATION_PATH "/modules"
    resources.modules = true;
    

    If you keep 'controllers' directory inside application folder then zf will not use modular structure hence make sure you cut and paste.