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

jbl*_*lue 8 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,生成模块和文件夹的文件夹product在其内部产生并且views,controllers,models该模块还生成.

  • 但我还需要将main移动views,controllers,modelsmodules/default他们自己的文件夹中.如果我手动创建该文件夹并将其移动到views,models,controllers那里,我在尝试向该default模块添加新控制器时会遇到错误.该缺陷是,它重新产生的主要(现在下落不明)views,controllers,modelsapplication并插入,在新的控制器application/controllers/newcont,因为它不承认默认控制器文件夹已被手动移动到application/modules/default/controllers/.

  • 所以我的解决方案就是zf create module defaultviews,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项目开始,这样就不会对确切的步骤产生混淆.

Tim*_*ain 10

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

$ zf create project .
$ zf create module product
$ zf create module default
Run Code Online (Sandbox Code Playgroud)

然后我感动controllers,modelsviews./application./application/modules.

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

resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"
Run Code Online (Sandbox Code Playgroud)

有:

resources.frontController.moduleDirectory = APPLICATION_PATH "/modules"
Run Code Online (Sandbox Code Playgroud)

告诉ZF在哪里找到模块.

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

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

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

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

请注意,在默认模块中,控制器不需要名称空间前缀.因此,在上面的示例中,默认模块中的控制器不需要前缀'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"

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

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

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

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

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