Zend控制器子目录自定义路由

时间:2014-01-10 13:52:42

标签: php zend-framework

我有以下结构的zend控制器:

Application
     Controllers - folder
         AlumniAdmin - sub folder
             DashboardController.php - class name AlumniAdmin_DashbaordController

         IndexController.php
         ErrorController.php

我知道我可以使用路线访问AlumniAdmin控制器:  / alumniadmin_dashboard / anyaction

但我想访问为  / alumniadmin-仪表板/ anyaction

我在bootstrap中使用了自定义路由:

`protected function _initRoutes()
{
        $router = Zend_Controller_Front::getInstance()->getRouter();
        $route = new Zend_Controller_Router_Route('alumniadmin-dashboard/:action/*',
                                           array('controller' => 'alumniadmin_dashboard' ));

        $router->addRoute('route', $route);
}`

这有两个问题:

  1. 当我点击/ alumniadmin-dashboard /它正在提供404但/ alumniadmin-dashboard / index工作正常。这意味着必须定义行动。

  2. 我想用 - 替换所有控制器的_符号。在上面的例子中,我必须为每个控制器明确写出每个路由。

  3. 有什么想法可以更好地解决上述问题。

    谢谢! 最诚挚的问候:)

2 个答案:

答案 0 :(得分:0)

您可以使用Zend路由正则表达式将_替换为自定义字符。有关详细信息,请参阅here

答案 1 :(得分:0)

我找到了解决方案。但可能有更好的方法来做到这一点。以下是我的解决方案:

我在Bootstrap.php中编写了以下逻辑。

`protected function _initSubDirRoutes()
{
    $subDirs = array(); $subDirPaths = array();
    $dirs = glob(APPLICATION_PATH.'/controllers/*', GLOB_ONLYDIR);
    foreach($dirs as $dir)
        $subDirPaths[] = strtolower(preg_replace('/(.)([A-Z])/', '$1-$2', basename($dir)));

    $parts = explode('/', $_SERVER['REQUEST_URI']);
    $subDirPath = $parts[3];
    if( in_array($subDirPath, $subDirPaths) )
    {
        $subDir = str_replace(' ', '', ucwords( str_replace('-',' ',$subDirPath)));
        $controllerName = str_replace(' ', '', ucwords( str_replace('-',' ',ucfirst($parts[4]))));
        $controller = $subDir.'_'.$controllerName;

        $router = Zend_Controller_Front::getInstance()->getRouter();
        $route = new Zend_Controller_Router_Route($subDirPath.'/'.$parts[4].'/:action/*', 
                                            array('controller'=>$controller, 
                                                  'action'=>'index'));
        $router->addRoute('route', $route);
    }
}   `

如果用户在浏览器中点击此网址 cso-admin / personal-info / users

  1. CsoAdmin是Controller文件夹中的Sub Dir - 区分大小写
  2. personal-info是sub dir中控制器的名称,类名为CsoAdmin_PersonalInfoController - 区分大小写
  3. 用户是操作名称