我刚刚处理了这个问题,但遇到了一些问题。 David Weinraub 的回答导致了更多信息,这些信息有评论,然后导致页面具有信用的页面,该页面具有执行此操作的基本/简单方法。
为了避免所有这些争吵,并就 Windows 与 Linux 做一些说明,以下是我所学到的。
我想在我的控制器目录的子目录中简单地组织一些管理控制器/操作,例如:
/application/controllers/
/application/controllers/admin/MyActionController.php
我不想参与模块。这不是一个包含各种模块的大型项目,我只是想更好地组织管理文件。
首先,我的开发机器是带Apache的Win7。我们的暂存/生产机器是 Linux(基于 Debian)。
最简单的解决方案是简单地创建一条自定义路线(我将在下面详细介绍该路线,以了解它对那些不熟悉它们的人的作用)。我在引导程序中这样做:
->addRoute('AdminRoute',
new Zend_Controller_Router_Route('/admin/:action/*', array('controller'=>'Admin_Index', 'action'=>'index'))
)
注意
- 'controller' => 'Admin_Index' 使用大写字母。虽然这在此示例中有效,但我发现这是对如何正确声明路由器控制器名称的误解。我的下一个示例将对此进行解释。
然后我会在这个目录中有这个文件:
/application/controllers/Admin/IndexController.php
控制器文件需要这样的类名:
class Admin_IndexController extends Zend_Controller_Action
{
...
}
这很简单。
这是我遇到的一些问题。 Windows 和 Linux 以存在区分大小写的问题而闻名。我相信 Windows 不区分大小写,而 Linux 区分大小写。
此外,虽然我上面的示例使用了一个名为“index”的管理控制器类,但实际上我有一个 Camel-Case 类名,例如“AdminIndexController.php”。
这在 Windows 上有效,但在 Linux 上引起了问题。我仍然不能 100% 确定这是在哪里发生的,但我通过并调试输出了一些标准路由器进程,发现自定义路由器设置在设置路由时需要特定格式。
我相信在标准路由器中声明控制器时,您使用 URL 命名约定进行解析,而不是 ZF 类名称约定。换句话说,路由器似乎不区分大小写,因此骆驼大小写没有正确地告诉路由器在哪里可以找到路由器。相反,我需要使用破折号(我已经使用了下划线)。
所以,如果你想有一个像这样命名的文件:
/application/controllers/Admin/FooIndexController.php
你应该像这样声明你的自定义路由器:
->addRoute('AdminRoute',
new Zend_Controller_Router_Route('/admin/:action/*', array('controller'=>'admin_foo-index', 'action'=>'index'))
)
您的控制器类名称将是:
class Admin_FooIndexController extends Zend_Controller_Action
{
...
}
自定义路由器
为了解释客户路由器,它基本上说对于任何以以下开头的 URL:
"/admin/"
使用定义的控制器和动作。我在后面的示例中将默认控制器设置为“admin_index”或“admin_foo-index”。
控制器“:action/”的部分就像一个变量,告诉 ZF 某些东西应该存在于 URL 的一部分中。但是,如果它留空,我们可以给它一个默认值。有点像编程函数中的默认参数。
在这种情况下,我设置了 'action' => 'index'。默认情况下,如果没有声明,它将使用 'index' Action。
如果给定了一个值,它将使用该值。因此,如果有人使用 URL(假设我们使用的是上面的第二个示例):
/admin/users/
路由器将使用控制器/动作
/application/controllers/Admin/FooIndexController.php
...
/* inside controller*/
function usersAction(){
...
}
希望这会有所帮助。我刚刚完成了这个故障排除过程,这就是我发现并解决了我遇到的问题。
干杯!