4

我正在为我的网站使用 Zend 框架,并且刚刚创建了一个特殊的模块“api”来创建......嗯,一个 API。

现在,我的模块中有很多控制器,我想在这个控制器目录中创建子目录以便“整理”它。我的新结构是这样的:

 - controllers/
 - controllers/contents/[controllers]
 - controllers/users/[controllers]
 - controllers/misc/[controllers]

但是,我发现自己完全找不到使用 Zend_Controller_Router_Route 可以映射到这些控制器的 URL 和重定向。是否有可能以某种方式做到这一点,或者我应该回到正常结构并将所有控制器放在同一个目录中?


我尝试按照 smack0007 的建议使用分隔符 _ ,并且考虑到 Zend Framework 通常如何引用子目录,这似乎是合乎逻辑的,但我得到了一个错误。


编辑:删除了长错误文本,因为它与问题无关,因为它只是一个问题,因为我没有使用适当的大小写,相信我必须在目录的第一个字母上加上大写。现在一切正常。

4

2 回答 2

4

我已经在 1.5 版本的项目中完成了这项工作,但我不知道它是否会继续工作。

您必须在控制器前面加上“{FOLDER}_”,然后在 url 中使用全名。

因此,在您的情况下,您将拥有一个名为:

contents_FooController

和一条路线:

/contents_foo/index
于 2010-03-08T15:08:26.283 回答
0

我试图在旧应用程序的 url 上完成多个级别,并避免使用大量 url 规则。所以我考虑将控制器分组到子目录中并为它定义一个 url roule。

对于一个结构

模块
 - 测试
   --控制器
     --sub
        -- 其他控制器.php
     --DefaultController.php

在我添加的模块的 Bootstrap.php 中:

public function __construct($application)
    {
        parent::__construct($application);
        $frontController = Zend_Controller_Front::getInstance();
        $frontController->addControllerDirectory(__DIR__ . '/controllers',
            'test');
        $frontController->addControllerDirectory(__DIR__ . '/controllers/sub',
            'test_sub');
    }

DefaultController.php 是

class Test_DefaultController extends Zend_Controller_Action {
     public function subAction()
    {
         $level1 = $this->getRequest()->getParam('level1');
         $level2 = $this->getRequest()->getParam('level2');
         return $this->_forward($level2, $level1, 'test_sub');
    }

所以这将转发到我们在子目录中的控制器。

  • “$level1”对应Controller名称,例如如果$level1 = “other”,那么我们转发到Othercontroller.php
  • "$level2" 是动作,例如 $level1 = "add" 然后调用 addAction()。

最后,添加路线:

new Zend_Controller_Router_Route_Regex('([a-z-]+)/([a-z-]+)/([a-z-]+)/([a-z-]+)/([a-z-]+)',
    array(),
    array(1 => 'module', 2 => 'controller', 3 => 'action', 4 => 'level1', 5 => 'level2'),
    '%s/%s/%s/%s/%s'
)

现在,例如通过请求test/default/sub/other/index,您可以在 OtherController.php 中调用 indexAction

于 2016-05-24T16:04:28.907 回答