我正在尝试为管理界面创建一个模块,但却无法让它完全响应 - 我到目前为止所做的是:我已经修改过了我的主应用程序的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是:
我错过了什么吗?根据一些书籍,例如" 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/index或http://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');
答案 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>