2012-05-09 5 views
1

У меня есть этот код:Добавить маршрутизатор модулей в Zend

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

Однако, если я вхожу в этот адрес:/администратор/это загрузить контроллер на /application/controllers/IndexController.php вместо одного в /application/modules/admin/controllers/IndexController.php

Мои полные самозагрузки эта один:

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() { 

    } 
} 
+0

Вы создали новый контроллер администратора и действие администратора? Вы можете проверить его в .zfproject.xml. –

+0

@JA: Присутствие или отсутствие чего-либо в '.zfproject.xml' ничего не значит – zerkms

+0

@JA Если я установил модуль как администратор и контроллер для индексации, а действие для индексации в параметрах по умолчанию в маршрутизаторе, то оно должно указывать на /application/modules/admin/controller/IndexController.php и вызовите метод indexAction, поэтому мне не нужно создавать AdminController.php с помощью adminAction. Тем не менее, это точно моя проблема ... это не работает таким образом ... – Cito

ответ

2

Создать новый каталог в имя папки приложений «модули/по умолчанию», вырезать вставьте свои «приложения/контроллеры» внутри него. Затем убедитесь, что ваши application.ini имеют

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

Если держать каталог 'диспетчеров внутри папки приложения, то не будет ZF использовать модульную структуру, поэтому убедитесь, что вы вырезать и вставить.

+0

Это было то, чего мне не хватало. Определенно, где я объявляю, где будет moduleDirectory. Спасибо за Ваш ответ! – Cito

0

После того, как у вас есть структура на основе модуля, обязательно создайте бутстрап для своего модуля с помощью ваших собственных маршрутов. например

class Example_Bootstrap extends Zend_Application_Module_Bootstrap 
    { 

    public function _initModuleRoutes() 
    { 
     $this->bootstrap('FrontController'); 
     $frontController = $this->getResource('FrontController'); 
     $router = $frontController->getRouter(); 

     $route = new Zend_Controller_Router_Route(
      'modulename/:action/*', 
      array(
        'module' => 'modulename', 
        'controller' => 'modulecontroller', 
        'action' => 'index' 
      ) 
     ); 
     $router->addRoute('routename', $route); 

     return $router; 
    }