【问题标题】:Zend Framework module structure routingZend Framework 模块结构路由
【发布时间】:2011-05-17 09:50:38
【问题描述】:

我的系统结构如下:

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 文件,那么它可以工作。那么我的路由有什么问题呢?

您的帮助将不胜感激。

【问题讨论】:

  • 这是您的完整路线列表吗?
  • 移除 $useDefaultRoutes = false;
  • @ShaunHare 每个模块都有它的引导文件。例如测试模块有它自己的:class Test_Bootstrap extends Zend_Application_Module_Bootstrap { }
  • @Ashley 删除后没有任何反应。

标签: zend-framework


【解决方案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";

【讨论】:

  • 这个工作正常,但我必须将每个模块都添加到自动加载器吗?
  • 是的,你只需要在那里添加..使用这种方法,您甚至可以在布局文件夹中设置主布局..
  • 是否可以让它完全动态化?不添加到自动加载器?
  • 我试过 $frontController->addModuleDirectory(APPLICATION_DIR . '/modules/modulename');没有成功。像上面那样单独添加每个模块对我来说是唯一有用的。
猜你喜欢
  • 1970-01-01
  • 2017-06-09
  • 1970-01-01
  • 1970-01-01
  • 2016-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-03
相关资源
最近更新 更多