具有子目录的Zend控制器路径

时间:2011-06-28 16:55:48

标签: zend-framework controller

我正在使用Zend Framework 1.11.x

我正在使用标准目录布局...... 我想做的是在我的控制器中有子目录

controller
 --- MemberController.php

取而代之的是

controller
 --Member
    ---MemberController.php

当我添加此目录结构,然后尝试通过执行以下操作来访问控制器:

$此-URL(阵列(控制器=> '部件' ....)

找不到控制器来创建网址

如何映射此子目录?我是否必须将每个子目录路径放在application.ini中?

如果是这样有没有办法一般地这样做,以便我可以把(我当前拥有的)基本路径放在application.ini中?

感谢

4 个答案:

答案 0 :(得分:2)

如果您正在考虑将控制器组合在一起,那么最好使用标准的zend模块化结构:

在引导程序中,为每个模块添加目录:

 $frontController = Zend_Controller_Front::getInstance();

 $frontController->setControllerDirectory(array(
   'default' => APPLICATION_PATH . '/controllers',
  'blog'    => APPLICATION_PATH . '/blog/controllers'
  'api'    =>   APPLICATION_PATH . '/api/controllers'

));

易于管理和维护,因为模块是自包含的并且彼此分离。 http://framework.zend.com/manual/en/zend.controller.modular.html

答案 1 :(得分:1)

Robert Basic写了这篇文章:

Grouping Zend Framework controllers in subdirectories

答案 2 :(得分:1)

我刚刚处理过这个问题,但我遇到了一些问题。 David Weinraub的回答导致更多的信息有一个评论然后导致页面有一个信用,有基本/简单的方法来做到这一点。

为了避免所有争吵并抛出关于Windows vs 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

并且Controller文件需要类名:

class Admin_IndexController extends Zend_Controller_Action
{
    ...
}

这很直接。

这是我遇到的一些问题。众所周知,Windows和Linux存在区分大小写的问题。我认为Windows将事物视为不区分大小写,而Linux则区分大小写。

另外,虽然我上面的示例使用名为“index”的Admin Controller类,但实际上我有一个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'Action。

如果给出了值,它将使用该值。所以,如果有人使用URL(假设我们使用上面的第二个例子):

/admin/users/

路由器将使用控制器/操作

/application/controllers/Admin/FooIndexController.php
...
/* inside controller*/
function usersAction(){
    ...
}

希望这有点帮助。我刚刚完成了这个故障排除过程,这就是我发现并解决了我遇到的问题。

干杯!

答案 3 :(得分:0)

将控制器放在子目录中时,应更改附加了FOLDER_NAME_的控制器类名称。

在您的情况下,成员控制器类名称将转为

Member_MemberController

然后访问此控制器的url将是

SITE_PATH/Member_Member