无法为Zend Framework Module加载模块的索引操作

时间:2012-02-21 04:10:24

标签: zend-framework module

我正在尝试为管理界面创建一个模块,但却无法让它完全响应 - 我到目前为止所做的是:我已经修改过了我的主应用程序的bootstrap文件加载模块目录:

$modules = PROJECT_DIR . '/library/PHPLib/ZF/Modules';
define('MODULES_DIR', $modules);
$frontController->addModuleDirectory(MODULES_DIR);

该模块包含在我的外部PHP库中,我为每个项目重复使用,ZendFramework是否基于。这是我第一次添加模块,但之前我曾使用该库来包含帮助程序类和插件而没有任何问题。模块的结构包含在PHPLib / ZF /模块中,如下所示:

ModAdmin/
  controller/
    IndexController.php
  model/
  view/
    includes/
    layouts/
    scripts/
      index/
        index.phtml

IndexController.php类被定义为" ModAdmin_IndexController"正如我所掌握的一些ZF资源的指示。脚本存在且尚未创建布局。我不确定我是否会使用它。

因此,当我尝试在浏览器中请求ModAdmin模块的索引时,我得到404.我使用的URL是:

http://hostname/ModAdmin/

我错过了什么吗?根据一些书籍,例如" ZendFramework In Action"和" ProPHP"他们说这就是所需要的。当我读到他们说这就是这么简单时,我几乎无法停止笑 - ZendFramework中没有任何东西永远都没有#34;那"简单 - 我喜欢ZF,ALOT,但它并不简单。之所以复杂,是因为它非常灵活和强大。

无论如何 - 任何想法?

修改

我想我应该补充一点,在Zend_Application或Zend_Tool类之前很久就开始使用ZF了 - 这是在ZF明智之前开始模仿RoR风格的MVC - 无论如何 - 我的项目没有任何这个因为直到我开始研究模块,我甚至都不知道它们的存在。话虽这么说 - 我没有时间来安装与这些相关的学习曲线,我非常满意手动创建我的引导程序。

实际上 - 说实话 - 我创建了一个部署工具'叫" padmin"这是一个CLI运行的PHP脚本,可以完成很多Zend_Tool的工作 - 我将它与" phing"结合使用。这就像" ant"对于PHP - 无论如何 - 我像大多数人那样绕过它。

EDIT2

我发现这个资源似乎解决了在不使用Zend_Tool的情况下添加模块的问题,尽管遵循了它所规定的所有要求,但在以所述方式请求模块时仍然会得到404代码: p>

http://hostname/modulename/indexhttp://hostname/modulename/

EDIT3

好伙计们 - 我无法表达这是多么令人沮丧。 Web上的每个资源都是使用Zend_Tool / Application引用模块的创建,或者我最终只讨论模块的非常具体的方面。我需要的东西可以帮助我调试为什么FrontController的调度/路由阶段没有找到模块。我在我的bootstrap中设置了modules目录。该模块具有控制器和视图脚本。就是这样 - 它不应该需要更多东西。它可能还需要什么?我已经尝试单独添加模块的控制器目录(而不是通过' addModuleDirectory'添加它),但仍然没有骰子。我之前提到的一些文档说:

  

匹配规则指定模块仅在a时匹配   传递的控制器目录数组中存在同名的键   到前端控制器和调度员。

好吧 - 伙计们 - 我做到了这一点:

    $defaultControllerDir  = PROJECT_DIR . '/application/controller';
    $modadminControllerDir = PROJECT_DIR . '/library/PHPLib/ZF/Modules/ModAdmin/controller';
$frontController->setControllerDirectory(array(
                                         'default'  => $defaultControllerDir,
                                         'modadmin' => $modadminControllerDir
                                        ));

然而 - 没有骰子。浏览器开始使用404.如果前端控制器具有某种内部审计/日志记录容量,我可以继续查看并确切地发生了什么(如果我想挖掘源代码,我想我可以做到并提出一些印刷声明,但这太荒谬了。)

这绝对令人头脑麻木。这件事发生在我很久以前,当我第一次学习ZF时 - 并且正如记录的那样 - 当出现问题时 - 很难理解为什么。好吧,我又来了另一个问题 - 我已经遵循了每一个可以想象的指示(我找到了约会zend_tool),但没有任何工作。

我唯一没做的就是设置我的目录结构:

modules/
  default/
    controllers/
    models/
    views/
  custom1/
    controllers/
    models/
    views/

但这样做会完全挫败模块的目的吗?如果我不能将模块化模块代码保存在库中(即不在应用程序目录中,而是在外部库中),那么创建模块到底是什么意思!我需要能够将模块代码放入我的库中:' / library / PHPLib / ZF / Modules / ModAdmin' - 是什么赋予了!

编辑 - 回应选定答案

非常有趣 - 在将Apache的目录设置更改为AllowOverride All后,我得到了插件对mod-admin请求的响应,而不是404(array(3){[" module& #34;] => string(9)" mod-admin" [" controller"] => string(5)" index" [&#34 ; action"] => string(5)" index"})然后,如果我禁用插件,我会收到此错误:

  

致命错误:未捕获的异常' Zend_Controller_Dispatcher_Exception'   消息'无效的控制器指定(索引)'在   /home/nevertap/work/nevertap/library/Zend/Controller/Dispatcher/Standard.php:248   堆栈跟踪:#0   /home/nevertap/work/nevertap/library/Zend/Controller/Front.php(954):   Zend_Controller_Dispatcher_Standard->调度(对象(的Zend_Controller_Request_Http),   对象(Zend_Controller_Response_Http))#1   /home/nevertap/work/nevertap/application/configuration/bootstrap.php(100):   Zend_Controller_Front-> dispatch()#2   /home/nevertap/work/nevertap/application/configuration/bootstrap.php(110):   Bootstrap-> configureFrontController()#3   /home/nevertap/www/nevertap/index.php(19):Bootstrap-> runApp()#4   抛出了{main}   /home/nevertap/work/nevertap/library/Zend/Controller/Dispatcher/Standard.php   在第248行

这很奇怪,因为... / Modules / mod-admin / controller / IndexController.php存在... / Modules / mod-admin / view / scripts / index / index.phtml - 更不用说了IndexController类适当地加上前缀为" ModAdmin_IndexController"

最终编辑

好的我终于得到了它 - 看起来像是通过加载模块目录来查找默认控制器目录,该目录总是被图案化为"控制器"而我的是"控制器"因此,我没有使用addModuleDir加载模块,而是使用了另一个:

$modadminControllerDir = PROJECT_DIR . '/library/PHPLib/ZF/Modules/mod-admin/controller';
$frontController->addControllerDirectory($modadminControllerDir, 'mod-admin');

2 个答案:

答案 0 :(得分:0)

看起来你仍然需要初始化模块,我在application.ini中用resources.modules[] = ""
来做 我相信你可以把它翻译成bootstrap代码。
你已经拥有的东西等同于 resources.frontController.moduleDirectory = APPLICATION_PATH "/modules"如果这给出了线索​​。

[编辑] 如果没有提到你的每个模块都应该拥有它自己的引导程序,那么扩展Zend_Application_Module_Bootstrap。

P.S。我刚刚通过Pro Zend框架技术工作,我发现它有很多有用的信息,但是目前的配置已经过时,而且目前在ZF中使用了一些工具。 Rob Allen保留了一份关于ZF的优秀教程,他在Akrabat.com保持最新的当前版本和Padrig Brady有一本很好的免费在线书籍,这是一本非常新的,它不是100%完整但是非常擅长于它涵盖的内容,在Survive the Deepend

找到它

答案 1 :(得分:0)

将您的模块目录重命名为“mod-admin”

mod-admin/
  controller/
    IndexController.php
  model/
  view/
   ...

您的控制器类应该保留ModAdmin_IndexController,然后通过http://hostname/mod-admin/

访问它

P.S。 当然还是这样做

$modules = PROJECT_DIR . '/library/PHPLib/ZF/Modules';
define('MODULES_DIR', $modules);
$frontController->addModuleDirectory(MODULES_DIR);

P.P.S

要查看您的请求发生了什么,您可以注册一个插件并覆盖routeshutdown方法,以var_dump这样的参数,(您的Bootstrap文件应该看起来像)

<?php

class TestPlugin extends Zend_Controller_Plugin_Abstract {

    public function routeShutdown(Zend_Controller_Request_Abstract $request) {
        var_dump($request->getParams());
        die();
    }

}

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap { ...

    protected function _initDebugingRequest() {
       $front = Zend_Controller_Front::getInstance();
       $front->registerPlugin(new TestPlugin());
    }
...

P.P.P.S

确保您使用 sudo a2enmod rewrite 启用了重写功能,并且还在 / etc / apache2 / sites-available / default 文件中启用了重写

<Directory /var/www/>
...
AllowOverride All
...
</Directory>