我试图在旧应用程序的 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