8

application我正在寻找有关如何从左侧文件夹包含的普通文件夹结构models,views,controllers到右侧的基于模块的文件夹结构的分步说明,其中application包含一个modules文件夹,其中包含单个模块及其拥有models,views,controllers.

我说“转换”是因为我认为 zend 不允许我们从一开始就使用模块体系结构创建项目,但如果这样做,那将是膨胀的,并且不需要手动进行这些文件夹结构更改。

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

这是我到目前为止的经验

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

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

  • 因此,我对此的解决方案是zf create module default然后将 main 复制到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 项目开始,这样就不会混淆确切的步骤。

4

2 回答 2

10

这是我为尝试遵循您的示例所做的(从头开始):

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

然后我搬家了controllers,从到。modelsviews./application./application/modules

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

resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"

和:

resources.frontController.moduleDirectory = APPLICATION_PATH "/modules"

它告诉 ZF 在哪里可以找到模块。

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

致命错误:在 ...

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

有两种方法可以修复此错误,并且文档非常具有误导性(甚至可能是错误的)。它指出

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

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

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

    resources.frontController.params.prefixDefaultModule = "1"

来自应用程序.ini。这一行告诉 ZF 在默认模块类上使用“Default_”命名空间,因此如果没有它,它将只查找“IndexController”。我选择了后一个选项,然后http://localhost/index/index按预期工作。

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

  • 你有不同的问题
  • 您在开发模式下禁用了错误
  • 您在默认情况下禁用错误的生产模式下运行(很可能)

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

我希望这是有帮助的。我只能说不要太依赖 Zend_Tool 来管理你的应用程序——它不能做所有事情,而且通常手动移动事情比尝试通过它做所有事情更容易。zf 命令;特别是在重组时。

于 2010-10-12T22:20:43.783 回答
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");
     }
  }

应用程序.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"

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

于 2010-10-12T17:16:22.560 回答