Yii框架:编写逻辑路由的自定义代码是一个好主意吗?

时间:2014-08-15 03:01:05

标签: php yii yii-routing

我想知道我的url路由是否有一些逻辑,使用自定义编码php比使用protected/config/main.php内的Yii urlManager更好。

"逻辑"上面提到的是一些if {...} else {...}的情况,我认为以urlManager的格式保存对于可读性来说是一个坏主意。但我不确定是否有其他解决方案,或者我想念urlManager的东西,或者可能是我在Yii中开发MVC的连接不正确。如果我出错了,请纠正我。

这是我想要做的:

  1. 如果网址的第一个参数是' admin' ,然后将第二个参数作为控制器名称,将第三个参数作为操作名称,并路由到位于' admin'内的控制器。文件夹中。
  2. 如果网址的第一个参数是'论坛' &安培;只有一个参数,然后路由到论坛'控制器将第二个参数传递给操作'索引'。
  3. 如果网址的第一个参数是'论坛' &安培;如果有一个以上的参数,那么请路由到#ForumPost'控制器,将除第一个参数之外的所有参数作为数组传递给action' index'。
  4. 除上述情况外,按照Yii的默认方式进行操作。控制器名称的第一个参数,第二个参数作为操作名称。
  5. P.S。可读性和易于维护是我第一次考虑,所以我避免使用.htaccess(我的伙伴不知道.htaccess,只有php)


    编辑:
    我已经写了我的rounteController(对不起,不是干净的代码。我稍后会把它分解成函数)

    public function actionIndex(){
    
    
    
        $is_Admin = false;
        $args = func_get_args ();
    
        //Language handle
        $arg_1 = strtolower ($args[0]);
        if($arg_1 == 'fr' || $arg_1 == 'en' ){
            setLanguage($arg_1);
            array_shift($args);
        }
    
        //check if admin
        $arg_1 = strtolower ($args[0]);
        if($arg_1 == 'admin'){
            $is_Admin = true;
            array_shift($args);
    
            //admin index
            if(count($args) == 0){
                $this->redirect(array('admin/'));
                exit();
            }
    
            //controller in admin
            $controllerName = strtolower ($args[0]);
            if(count($args) == 1){
    
                //controller only
                $this->redirect(array('admin_'.$controllerName.'/'));
                exit();
    
            }elseif(count($args) == 2){
    
                //controller + action
                $controllerName = strtolower ($args[0]);
                $actionName     = strtolower ($args[1]);        
                $this->redirect(array('admin_'.$controllerName.'/'.$actionName));
                exit;
    
            }else{
    
                //controller + action + parameter
                $controllerName = strtolower ($args[0]);
                $actionName     = strtolower ($args[1]);
                $para           = $args[2];
                if(is_numeric ($para){
    
                    // id parameter
                    $this->redirect(array(
                        'admin_'.$controllerName.'/'.$actionName,
                        'id'=>$para;
                    ));
                    exit;
    
                }else{
    
                    // string parameter
                    $this->redirect(array(
                        'admin_'.$controllerName.'/'.$actionName,
                        'str'=>$para;
                    ));
                    exit;
    
                }
            }
        }
    
        //forum
        $arg_1 = strtolower ($args[0]);
        if($arg_1 == 'forum'){
            if(count($args) < 2){
                //only one more parameter after 'forum'
                //rounte to 'forum' controller 
                $cateSlug = $arg_1 = strtolower ($args[1]);
                $this->redirect(array(
                    'forum/index',
                    'cateSlug'=> $cateSlug)
                );
                exit();
            }else{
                //only one more parameter after 'forum'
                //rounte to 'forumPost' controller 
                $cateSlug  = strtolower ($args[1]);
                $topicSlug = strtolower ($args[2]);
                $this->redirect(array('
                    forumPost/index', 
                    'cateSlug'=> $cateSlug, 
                    'topicSlug'=> $topicSlug)
                );
                exit();
            }
        }
    
        //----normal case ---
    
        //site index
        if(count($args) == 0){
            $this->redirect(array('site/index'));
            exit;
        }
    
        if(count($args) == 1){
    
            //controller only
            $controllerName = strtolower ($args[0]);
            $this->redirect(array($controllerName.'/'));
            exit;
        }elseif(count($args) == 2){
    
            //controller + action
            $controllerName = strtolower ($args[0]);
            $actionName     = strtolower ($args[1]);        
            $this->redirect(array($controllerName.'/'.$actionName));
            exit;
        }else{
    
            //controller + action + parameter
            $controllerName = strtolower ($args[0]);
            $actionName     = strtolower ($args[1]);
            $para           = $args[2];
            if(is_numeric ($para){
    
                // id paremeter
                $this->redirect(array(
                    $controllerName.'/'.$actionName,
                    'id'=>$para;
                ));
                exit;
            }else{
    
                // string paremeter
                $this->redirect(array(
                    $controllerName.'/'.$actionName,
                    'str'=>$para;
                ));
                exit;
            }
        }
    }
    

    编辑2:

    enter image description here

    enter image description here

    $ this-&gt; redirect()函数并非直接指向控制器....它仍然通过了思想urlManager .....

1 个答案:

答案 0 :(得分:0)

我认为你已经意识到了模块:

管理员; 论坛;

然后你可以使用:

site.com/admin/ - admin panel

site.com/forum/ - forum

以及

site.com/site/index will be home page

这只是我决定的第一件事,如果您在一个应用程序中使用您的网络应用程序存在论坛,这个变体就会正确。