【问题标题】:rout the admin controllers in with HMVC使用 HMVC 路由管理控制器
【发布时间】:2015-07-10 02:34:53
【问题描述】:

我对 HMVC 有疑问

我的所有模块中都有这样的管理控制器

- 模块 - 用户 - 控制器 - 管理员.php - 用户.php - 意见 - admin_create_user.php - admin_view_users.php - 注册.php - 登录.php - 消息 - 控制器 - 管理员.php - 新闻.php - 意见 - admin_disply_news.php - admin_create_news.php - view_news.php

现在当转到用户管理员时,URL 将链接到此

  • domain.com/users/admin/method.
  • domain.com/news/admin/method.

但我需要它是

  • domain.com/admin/users/method
  • domain.com/admin/news/method

【问题讨论】:

    标签: codeigniter hmvc


    【解决方案1】:

    在“my_Router”类的“core/MY_Router.php”中添加这些代码 - *(class MY_Router extends MX_Router {** ---代码在这里-- **})*

    我尝试使用路由规则和 .htaccess 来做到这一点,但它们都不起作用。然后我编辑 MX_Router 代码并完美运行,但要注意一件事,您必须在模块的控制器调用“admin”上创建一个子文件夹,并将控制器放在那里像这样工作,因为这样如果控制器名称与模块名称相同,您可以通过直接调用控制器来使用模块的默认路由。

    public $module;
    private $located = 0;
    
    protected function _set_request($segments = array()){
        $segments = $this->_validate_request($segments);
        // If we don't have any segments left - try the default controller;
        // WARNING: Directories get shifted out of the segments array!
        if (empty($segments))
        {
            $this->_set_default_controller();
            return;
        }
    
        if ($this->translate_uri_dashes === TRUE)
        {
            $segments[0] = str_replace('-', '_', $segments[0]);
            if (isset($segments[1]))
            {
                $segments[1] = str_replace('-', '_', $segments[1]);
            }
        }
    
        if($segments[0] == 'admin' && isset($segments[1])){
            if (isset($segments[2])){
                $this->set_method($segments[2]);
                $segments[2] = $segments[2];
            }else{
                $this->set_method('index');
                $segments[2] = 'index';
            }
            $this->directory    = '../modules/'.$segments[1].'/controllers/admin/'; 
            $this->module       = $segments[1];
            $this->class        = $segments[1];
    
            $segments[1] = $segments[1];
    
    
            unset($segments[0]);
            $this->uri->rsegments = $segments;
        }else{
            $segments = $this->locate($segments);
    
            if($this->located == -1)
            {
                $this->_set_404override_controller();
                return;
            }
    
            if(empty($segments))
            {
                $this->_set_default_controller();
                return;
            }
    
            $this->set_class($segments[0]);
    
            if (isset($segments[1]))
            {
                $this->set_method($segments[1]);
            }
            else
            {
                $segments[1] = 'index';
            }
    
            array_unshift($segments, NULL);
            unset($segments[0]);
            $this->uri->rsegments = $segments;  
        }   
    }
    

    【讨论】:

      【解决方案2】:

      您可以尝试将其添加到您的路线配置文件中:

      $route['domain.com/admin/users/(:any)'] = 'domain.com/users/admin/method';
      $route['domain.com/admin/news/(:any)'] = 'domain.com/news/admin/method';
      

      当用户输入 domain.com/admin/users/method 时,它会调用 user 控制器。

      Documentation

      【讨论】:

      • 如果我这样做,那么我需要在 rout config 中添加所有模块方法。并且不知道所有模块名称。用户可以将任何模块添加到此脚本中。
      • 那是 (:any) 跳转的部分。你可以在 domain.com/users/admin/method的末尾添加这个> 代替方法:。 $this->uri->segment(3).
      • 你是对的,但我不知道这个模块中的所有模块名称或所有控制器我需要动态路由它
      • 你不能在 uri->segment(4) 中添加模块,构建收集函数并从那里动态路由吗?
      • 抱歉让..我的溃败配置像这样$route['admin/(:any)']="$1/admin";它运作良好,但是当 URL 包含像“admin/users/add”这样的方法名称时,会出现错误“找不到页面”。现在应该做什么。
      猜你喜欢
      • 2014-09-11
      • 2013-05-06
      • 2016-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-25
      • 1970-01-01
      相关资源
      最近更新 更多