逐步转换为zend项目的基于模块的文件夹结构

时间:2010-10-12 06:24:35

标签: php zend-framework zend-view

我正在寻找有关如何从application文件夹包含models,views,controllers的左侧的常规文件夹结构转到基于模块的文件夹结构的分步说明application包含modules文件夹的权利,该文件夹包含具有各自models,views,controllers的各个模块。

我说“转换”因为我认为zend不允许我们从一开始就使用模块架构创建项目,但如果确实如此,那将会膨胀并且无需手动更改这些文件夹结构。

http://img375.imageshack.us/img375/5582/foldersboth.jpg

这是我迄今为止的经历

  • 当我创建模块zf create module product时,会生成modules文件夹,并在其中生成文件夹product,并且还会生成该模块的views,controllers,models

  • 但我还需要将主views,controllers,models移动到他们自己的modules/default文件夹中。如果我手动创建该文件夹并在那里移动主views,models,controllers,那么在尝试向该default模块添加新控制器时会出现错误。该错误是重新生成 views,controllers,models中的主要(现在缺失)application并在application/controllers/newcont中插入新控制器,因为它无法识别默认控制器文件夹已手动移至application/modules/default/controllers/

  • 所以我的解决方案是zf create module default,然后将主views,models,controllers复制到那里。它最终看起来一样,但不知怎的,zf create module方法有所不同。当我这样做时,新的控制器被正确添加到application/modules/default/controllers而不是application/controllers

问题的一半解决了。但是当我尝试查看应用程序时,我看不到index/index视图中的任何内容。我也没有任何错误,但我什么都没看到。我怀疑这是因为应用程序不知道index/index视图已移动。

  • 过去常见于application/views/scripts/index/index.phtml
  • 但现在位于application/modules/default/views/scripts/index/index.phtml

我猜我需要对application.ini或bootstrap.php或其他位置进行更改。那么究竟是什么步骤让这件事顺利完成并让它发挥作用?我正在使用最新的ZF 1.10.8。请从创建一个新的zend项目开始,这样就不会对确切的步骤产生混淆。

2 个答案:

答案 0 :(得分:10)

以下是我尝试按照您的示例(从头开始)所做的事情:

$ zf create project .
$ zf create module product
$ zf create module default

然后我将controllersmodelsviews./application移至./application/modules

接下来我打开了application.ini,替换了这一行(它告诉ZF在非模块化应用程序中找到控制器的位置):

resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"

使用:

resources.frontController.moduleDirectory = APPLICATION_PATH "/modules"

告诉ZF在哪里找到模块。

然后我手动为产品模块创建了一个索引控制器,这样我就可以测试它是否有用了。然后我点击http://localhost/index/index以查看默认模块索引操作是否仍然有效,但它没有,而是我收到了错误:

  

致命错误:未捕获的异常'Zend_Controller_Dispatcher_Exception',消息'Invalid controller class(“Default_ErrorController”)'in ...

听起来这就是你要去的地方。

有两种方法可以解决此错误,文档很容易引起误解(可能甚至是错误的)。它states

  

请注意,在默认模块中,控制器不需要名称空间前缀。因此,在上面的示例中,默认模块中的控制器不需要前缀'Default_' - 它们只是根据它们的基本控制器名称调度:'IndexController'和'FooController'。但是,名称空间前缀用于所有其他模块。

但很明显上面的错误表明ZF正在寻找名为Default_ErrorController的ErrorController类。要解决此问题,您可以执行以下两项操作之一:

  • 将application / modules / default / controllers / IndexController.php的类名从IndexController更改为Default_IndexController,将application / modules / default / controllers / ErrorController.php更改为ErrorControllerDefault_ErrorController
  • 或删除此行:

    resources.frontController.params.prefixDefaultModule =“1”

来自application.ini的

。这一行告诉ZF在默认模块类上使用'Default_'命名空间,所以没有它它只会查找'IndexController'。我选择后一个选项,然后http://localhost/index/index按预期工作。

在你的情况下,你说你在/ index / index上有一个空白页面,这意味着:

  • 您有其他问题
  • 您在开发模式中禁用了错误
  • 您正在生产模式下运行,默认情况下会禁用错误(最有可能)

要检查最后一个选项,请在生产部分中打开application.ini,然后暂时phpSettings.display_errors从0更改为1。如果你在上面遇到同样的错误,希望你能够让一切正常。

我希望这会有所帮助。我可以说的是,不要太依赖Zend_Tool来管理您的应用程序 - 它无法完成所有事情,并且通常手动移动事物比尝试通过所有事情更容易。 zf命令;特别是在重组时。

答案 1 :(得分:1)

我是Netbeans IDE的开发者。

http://i.stack.imgur.com/n9Zjn.jpg

我是新手:P(需要10分)

每个Bootstrap应该有:

<?php 
// Public_Bootstrap replace for Blog_Bootstrap or Administrator_Bootstrap
// well its for me
class Public_Bootstrap extends Zend_Application_Module_Bootstrap {

}

主要引导:

<?php
    class Bootstrap extends Zend_Application_Bootstrap_Bootstrap {

       protected function _initAutoLoad() {

          $modLoader = new Zend_Application_Module_Autoloader(
                    array(
                        'namespace' => '',
                        'basePath' => APPLICATION_PATH . '/modules/public'
                    )
          );        

          return $modLoader;
       }
       public function _initViewHelpers() {

          $this->bootstrap(array('frontcontroller', 'view'));
          $view = $this->getResource('view');
          $view->doctype('XHTML1_STRICT');
          $view->headMeta()->appendHttpEquiv("Content-Type", "text/html;charset=UTF-8")
            ->appendName("description", "Some description");
     }
  }

application.ini:

[production]
resources.modules[] =
phpSettings.display_startup_errors = 0 
phpSettings.display_errors = 0
includePaths.library = APPLICATION_PATH "/../library"
bootstrap.path = APPLICATION_PATH "/Bootstrap.php" 
bootstrap.class = "Bootstrap" 
resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts/"

resources.frontController.moduleDirectory = APPLICATION_PATH "/modules"
resources.frontController.defaultmodule = "public" 
resources.frontController.prefixDefaultModule = true  

resources.view[] = 

resources.db.adapter = PDO_MYSQL
resources.db.isDefaultTableAdapter = true 
resources.db.params.host ="localhost"
resources.db.params.username ="yourUser"
resources.db.params.password ="yourPassword"
resources.db.params.dbname ="DBName"

我的引导程序包含更多代码,包括插件。