Маршрутизация структуры модуля Zend Framework

#zend-framework

#zend-framework

Вопрос:

У меня есть следующая структура моей системы:

 application/
   configs/
     application.ini
     router.php
   layouts/
   modules/
      default/
        controllers/
        forms/
        models/
        views/
        Bootstrap.php
      test/
        controllers/
        forms/
        models/
        views/
        Bootstrap.php
    Bootstrap.php
  

routes.php файл:

 $useDefaultRoutes = false;

$routes['index'] = new Zend_Controller_Router_Route(
                       '', 
                       array('controller' => 'index',
                       'action' => 'index', 
                       'module' => 'default'));
  

Главная Bootstrap.php файл

 class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{

    public static function setRoutes(){

        $frontController = Zend_Controller_Front::getInstance(); 
        $router = $frontController->getRouter();

        $routes = array();


        if(file_exists('../application/configs/routes.php'))
        {

            require_once "configs/routes.php";

            foreach($routes as $routeName => $routeValue){
                $router->addRoute($routeName, $routeValue);
            }

            if($useDefaultRoutes == false)
            {
                $router->removeDefaultRoutes();
            }

        }

    }

    protected function _initFrontModules() {
        $this->bootstrap('frontController');
        $front = $this->getResource('frontController');     
        $this->setRoutes();
    }

}
  

Проблема

Когда я набираю в браузере http://address затем модуль по умолчанию запускает IndexController, и, похоже, все в порядке. Но если я наберу http://address/test, затем я получаю сообщение об ошибке — страница не найдена. Если я удалю routes.php файл, тогда это работает. Итак, в чем проблема с моей маршрутизацией?

Мы были бы признательны за вашу помощь.

Комментарии:

1. Это ваш полный список маршрутов?

2. Удалить $useDefaultRoutes = false;

3. @ShaunHare У каждого модуля есть свой загрузочный файл. Например, тестовый модуль имеет свой собственный: класс Test_Bootstrap расширяет Zend_Application_Module_Bootstrap { }

4. @Ashley После удаления ничего не происходит.

Ответ №1:

Попробуйте этот новый способ маршрутизации…

Включите это в свой bootstrap.php

 protected function _initAutoloadModules()
{
    $autoloader = new Zend_Application_Module_Autoloader(
        array(
            'namespace' => '',
            'basePath'  => APPLICATION_PATH . '/modules/default'
        ), 
        array(
            'namespace' => 'Admin',
            'basePath'  => APPLICATION_PATH . '/modules/test'
        )            
      );
    return $autoloader;
}
  

Это ваш application.ini

 phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1
resources.frontController.params.displayExceptions = 1
includePaths.library = APPLICATION_PATH "/../library"
appnamespace = "Default"
bootstrap.path = APPLICATION_PATH "/Bootstrap.php"
bootstrap.class = "Bootstrap"
resources.frontController.defaultModule = "default"
resources.frontController.defaultController = "index"
resources.frontController.defaultAction = "index"
resources.frontController.moduleDirectory = APPLICATION_PATH "/modules"
resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts"
resources.layout.layout = "layout"
resources.modules = ""
resources.view[] =
resources.session.remember_me_seconds = 864000
resources.session.use_only_cookies = on
includePaths.models = APPLICATION_PATH "/models/"
resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts/"
  

и в module/default/bootstrap.php добавьте приведенную ниже переменную

 protected $_moduleName="default";
  

и в module/test/bootstrap.php добавьте приведенную ниже переменную

 protected $_moduleName="test";
  

Комментарии:

1. Этот работает нормально, но должен ли я добавлять каждый модуль в автозагрузчик?

2. да, вам нужно добавить только туда.. при таком подходе вы даже можете установить основной макет в папке layout..

3. Возможно ли сделать это полностью динамичным? Без добавления в автозагрузчик?

4. Я пытался выполнить $FrontController-> addModuleDirectory(APPLICATION_DIR . ‘/modules/modulename’); безуспешно. Добавление каждого модуля отдельно, как указано выше, было единственным, что сработало для меня.