【问题标题】:Codeigniter multiple controllers vs many methods?Codeigniter 多个控制器与多种方法?
【发布时间】:2011-11-06 12:44:00
【问题描述】:

我有一个网站,其中有很多页面都位于根目录(例如/contact/about/home/faq/privacy/tos 等)。我的问题是这些都应该是单独的控制器还是一个具有多种方法的控制器(例如 main.php 控制器中的 contactaboutindex)?

更新: 我刚刚意识到默认控制器中的方法在没有默认控制器的情况下不会显示在 url 中(即 main/contact 不会自动路由到 /contact 如果 main 是默认控制器)。所以你需要进入路由并覆盖每个page

【问题讨论】:

    标签: php model-view-controller codeigniter


    【解决方案1】:

    如果所有这些都只是页面,我建议将它们放入单个控制器中。我通常最终将这样的静态页面放入“页面”控制器并为每个静态页面添加路由以绕过我的 URL 中的“/页面”。

    【讨论】:

    • 我想要一种自动进行路由的方法。 :(
    • 我发现自动获取路由的唯一方法是使用$route['(:any)'] = 'pages/$1'; 之类的路由,但是我必须为我的所有控制器声明路由......我从来没有真正这样做,除非我的静态页面比控制器多得多。
    • @ThomasReggi ... 为什么?为这些页面写下你的路线需要 5 分钟,然后你就完成了......
    【解决方案2】:

    如果它们共享相同的功能,那么它们应该在同一个控制器中。
    例如,如果他们都使用相同的模型来获取内容,那么一个控制器就可以轻松处理它。
    为什么在一个控制器中?因为你总是想重用你的代码。

       class someController{
        function cotact(){
            print $this->getContentFromModel(1);
    
        }
    
        function about(){
            print $this->getContentFromModel(2);
        }
    
        function home(){
            print $this->getContentFromModel(3);
        }
    
        private function getContentFromModel($id){
            return $this->someContentModel->getContentById($id);
        } 
    }
    

    (而不是print,您应该使用加载view

    在我的示例中查看所有函数如何使用相同的 getContentFromModel 函数来共享相同的功能。

    但这只是一种情况,在某些情况下,我的示例可能不利于...

    【讨论】:

      【解决方案3】:

      在 application/config/routes.php 中

      $route['contact'] = "mainController/contact";
      $route['about'] = "mainController/about";
      $route['home'] = "mainController/home";
      $route['faq'] = "mainController/faq";
      $route['privacy'] = "mainController/privacy";
      

      您应该在 mainController.php 中添加所有这些方法

      您还可以将页面的内容保存在数据库中,供他们查询。例如,您可以发送 url 作为关键字来识别页面内容

         $route['contact'] = "mainController/getContent/contact";
          $route['about'] = "mainController/getContent/about";
          $route['home'] = "mainController/getContent/home";
          $route['faq'] = "mainController/getContent/faq";
          $route['privacy'] = "mainController/getContent/privacy";
      

      在这种情况下,您只需在控制器“mainController”中创建一个名为“getContent”的方法,该方法将如下所示:

      class mainController extends CI_Controller
      {
      public function getContent($param)
      {
          $query = $this->db->get_where('mytable', array('pageName' => $param));
      //  then get the result and print it in  a view
          }    
          }
      

      希望这对你有用

      【讨论】:

        【解决方案4】:

        您列出的页面名称可能应该是主控制器中的不同方法。当您拥有与另一个特定实体(如用户)相关的其他功能时,您可以为用户实体创建另一个控制器,并使用不同的方法来显示用户、更新用户、注册用户。但它确实是一个工具,可以让您以对您的域和域模型有意义的方式组织您的应用程序。

        【讨论】:

          【解决方案5】:

          我写了一篇关于组织 CodeIgniter 控制器方法的博文,可能对您有所帮助。在这里查看:http://caseyflynn.com/2011/10/26/codeigniter-php-framework-how-to-organize-controllers-to-achieve-dry-principles/

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2013-06-27
            • 2012-03-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-05-20
            相关资源
            最近更新 更多