【问题标题】:Zend Controller Path with Sub Dirs带有子目录的 Zend 控制器路径
【发布时间】:2014-04-29 15:03:58
【问题描述】:

我正在使用 Zend Framework 1.11.x

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

controller
 --- MemberController.php

改为

controller
 --Member
    ---MemberController.php

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

$this-url(array(controller=>'member'....)

找不到创建url的控制器

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

如果是这样,有没有一种通用的方法,以便我可以将(我目前拥有的)基本路径放在 application.ini 中?

谢谢

【问题讨论】:

  • 所以您希望每个控制器都位于它自己的子目录中,该子目录与控制器本身同名吗?还是您希望所有控制器都在一个名为 Member 的子目录中?

标签: zend-framework controller


【解决方案1】:

如果您正在考虑将控制器组合在一起,最好使用标准的 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

【讨论】:

    【解决方案2】:

    Robert Basic 曾写过这篇文章:

    Grouping Zend Framework controllers in subdirectories

    【讨论】:

      【解决方案3】:

      我刚刚处理了这个问题,但遇到了一些问题。 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(){
          ...
      }
      

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

      干杯!

      【讨论】:

      • 请注意,我必须在 Linux 上的控制器文件夹中为 Admin 使用大写字母“A”。 "/controllers/Admin/"
      【解决方案4】:

      当您将控制器放在子目录中时,您应该更改控制器类名称,并附加FOLDER_NAME_

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

      Member_MemberController
      

      那么访问这个控制器的url就是

      SITE_PATH/Member_Member
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-02-15
        • 2014-04-16
        • 2011-04-22
        • 1970-01-01
        • 1970-01-01
        • 2014-04-08
        • 2014-05-11
        相关资源
        最近更新 更多