草庐IT

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

coder 2024-01-01 原文

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

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

这是我目前的体验

  • 当我创建一个模块 zf create module product 时,会生成模块文件夹,并在其中生成一个文件夹 productviews,还生成该模块的 Controller 、模型

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

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

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

  • 这曾经位于 application/views/scripts/index/index.phtml
  • 但现在位于 application/modules/default/views/scripts/index/index.phtml

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

最佳答案

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

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

然后我将 controllersmodelsviews./application 移动到 ./application/模块

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

resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"

与:

resources.frontController.moduleDirectory = APPLICATION_PATH "/modules"

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

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

Fatal error: Uncaught exception 'Zend_Controller_Dispatcher_Exception' with message 'Invalid controller class ("Default_ErrorController")' in ...

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

有两种方法可以修复此错误,文档具有误导性(甚至可能是错误的)。它states :

Note that in the default module, controllers do not need a namespace prefix. Thus, in the example above, the controllers in the default module do not need a prefix of 'Default_' -- they are simply dispatched according to their base controller name: 'IndexController' and 'FooController'. A namespace prefix is used in all other modules, however.

但上面的错误显然表明 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 命令;尤其是在重组时。

关于php - 逐步转换为 zend 项目的基于模块的文件夹结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3912131/

有关php - 逐步转换为 zend 项目的基于模块的文件夹结构的更多相关文章

  1. ruby - 使用 RubyZip 生成 ZIP 文件时设置压缩级别 - 2

    我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看ruby​​zip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d

  2. ruby - 在 Ruby 中使用匿名模块 - 2

    假设我做了一个模块如下:m=Module.newdoclassCendend三个问题:除了对m的引用之外,还有什么方法可以访问C和m中的其他内容?我可以在创建匿名模块后为其命名吗(就像我输入“module...”一样)?如何在使用完匿名模块后将其删除,使其定义的常量不再存在? 最佳答案 三个答案:是的,使用ObjectSpace.此代码使c引用你的类(class)C不引用m:c=nilObjectSpace.each_object{|obj|c=objif(Class===objandobj.name=~/::C$/)}当然这取决于

  3. ruby - 其他文件中的 Rake 任务 - 2

    我试图在一个项目中使用rake,如果我把所有东西都放到Rakefile中,它会很大并且很难读取/找到东西,所以我试着将每个命名空间放在lib/rake中它自己的文件中,我添加了这个到我的rake文件的顶部:Dir['#{File.dirname(__FILE__)}/lib/rake/*.rake'].map{|f|requiref}它加载文件没问题,但没有任务。我现在只有一个.rake文件作为测试,名为“servers.rake”,它看起来像这样:namespace:serverdotask:testdoputs"test"endend所以当我运行rakeserver:testid时

  4. ruby-on-rails - 在 Rails 中将文件大小字符串转换为等效千字节 - 2

    我的目标是转换表单输入,例如“100兆字节”或“1GB”,并将其转换为我可以存储在数据库中的文件大小(以千字节为单位)。目前,我有这个:defquota_convert@regex=/([0-9]+)(.*)s/@sizes=%w{kilobytemegabytegigabyte}m=self.quota.match(@regex)if@sizes.include?m[2]eval("self.quota=#{m[1]}.#{m[2]}")endend这有效,但前提是输入是倍数(“gigabytes”,而不是“gigabyte”)并且由于使用了eval看起来疯狂不安全。所以,功能正常,

  5. ruby-on-rails - Ruby net/ldap 模块中的内存泄漏 - 2

    作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代

  6. ruby-on-rails - Rails 3 中的多个路由文件 - 2

    Rails2.3可以选择随时使用RouteSet#add_configuration_file添加更多路由。是否可以在Rails3项目中做同样的事情? 最佳答案 在config/application.rb中:config.paths.config.routes在Rails3.2(也可能是Rails3.1)中,使用:config.paths["config/routes"] 关于ruby-on-rails-Rails3中的多个路由文件,我们在StackOverflow上找到一个类似的问题

  7. ruby - 将差异补丁应用于字符串/文件 - 2

    对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl

  8. ruby - 使用 ruby​​ 将 HTML 转换为纯文本并维护结构/格式 - 2

    我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h

  9. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

    我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

  10. ruby - 使用 Vim Rails,您可以创建一个新的迁移文件并一次性打开它吗? - 2

    使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta

随机推荐