Codeigniter - CMS 的最佳路由配置?

Posted

技术标签:

【中文标题】Codeigniter - CMS 的最佳路由配置?【英文标题】:Codeigniter - best routes configuration for CMS? 【发布时间】:2011-04-13 02:36:03 【问题描述】:

我想在 Codeigniter 中创建一个自定义 CMS,我需要一种机制来将常规页面路由到默认控制器 - 例如:

mydomain.com/about
mydomain.com/services/maintenance

这些将通过我的页面处理程序控制器进行路由。 Codeigniter 中的默认路由行为当然是路由到匹配的控制器和方法,因此对于上面的示例,它需要一个 About 控制器和一个 Services 控制器。这显然不是一个实用甚至不明智的方法。

我在 routes.php 中看到了以下解决方案:

$route['^(?!admin|products).*'] = "pagehandler/$0";

但我相信这会带来它自己的问题。例如,它只是在请求 uri 中查找“产品”,如果找到到 Products 控制器的路由 - 但是如果我们将服务/产品作为 CMS 页面怎么办?这不会被路由到产品控制器吗?

有没有完美的方法来解决这个问题?我不希望所有 CMS 内容都以控制器名称为前缀的路由,但我还需要能够一般地覆盖其他控制器的路由。

【问题讨论】:

鉴于您在帖子中提供的信息,很难确切地说出最佳方法是什么。 “CMS 内容”到底是什么意思?您希望您的 URI 在不同的情况下如何显示?我知道您可能很清楚自己想要做什么,但我们需要更具体的示例来帮助您。 老实说,我从未在 CI 应用程序中使用过任何路由。 【参考方案1】:

如果您使用 CodeIgniter 2.0(已经足够稳定可以使用几个月),那么您可以使用:

$route['404_override'] = 'pages';

这会将任何不是控制器、方法或有效路由的内容发送到您的页面控制器。然后,您可以使用任何您喜欢的 PHP 来显示页面或显示更好的 404 页面。

阅读我的指南,解释你是如何upgrade to CodeIgniter 2.0。此外,您可能有兴趣使用现有的 CMS,例如 PyroCMS,它现在接近最终的 v1.0 并且拥有大量追随者。

【讨论】:

【参考方案2】:

你很幸运。我自己正在开发一个 CMS,我花了很长时间才找到一个可行的解决方案。让我解释一下自己,以确保我们在同一页面上,但我相当确定我们是一致的。

您的网址可以采用以下方式格式化:

http://www.mydomain.com/about - 没有分类的***页面http://www.mydomain.com/services/maintenance - 有父分类的页面http://www.mydomain.com/services/maintenace/server-maintenance - 有分类和子分类的页面。

在我的页面控制器中,我使用了 _remap 函数,该函数基本上捕获对控制器的所有请求,并让您可以对它们做任何事情。

这是我的代码,为了您的方便而注释:

<?php

class Pages extends Controller 

    // Captures all calls to this controller
    public function _remap() 
    
        // Get out URL segments
        $segments = $this->uri->uri_string();
        $segments = explode("/", $segments);

        // Remove blank segments from array
            foreach($segments as $key => $value) 
               if($value == "" || $value == "NULL") 
                   unset($segments[$key]);
               
            

            // Store our newly filtered array segments
            $segments = array_values($segments); 

            // Works out what segments we have
            switch (count($segments))
            
                // We have a category/subcategory/page-name
                case 3:
                    list($cat, $subcat, $page_name) = $segments;
                break;

                // We have a category/page-name
                case 2:
                    list($cat, $page_name) = $segments;
                    $subcat = NULL;
                break;

                // We just have a page name, no categories. So /page-name
                default:
                    list($page_name) = $segments;
                    $cat = $subcat = NULL;
                break;
            

        if ($cat == '' && $subcat == '') 

            $page  = $this->mpages->fetch_page('', '', $page_name);

         else if ($cat != '' && $subcat == '') 

            $page  = $this->mpages->fetch_page($cat, '', $page_name);

         else if ($category != "" && $sub_category != "") 

            $page = $this->mpages->fetch_page($cat, $subcat, $page_name);
        

                // $page contains your page data, do with it what you wish.


?>

您当然需要修改您的页面获取模型函数接受 3 个参数,然后根据您正在查看的页面类型传入信息。

在您的 application/config/routes.php 文件中,只需输入您想要路由的特定 URL,然后在最底部输入:

/* Admin routes, login routes etc here first */

$route['(:any)'] = "pages"; // Redirect all requests except for ones defined above to the pages controller.

如果您需要更多说明或可下载的示例代码,请告诉我。

【讨论】:

这样做的问题是您必须将 WAAAY 设置为许多路由,只需升级到 CI 2 并使用 404_override :)

以上是关于Codeigniter - CMS 的最佳路由配置?的主要内容,如果未能解决你的问题,请参考以下文章

CodeIgniter后端前端.htaccess路由器

Codeigniter 路由控制器子文件夹

基于 CodeIgniter 的 CMS [关闭]

Laravel 自动路由,如 Codeigniter - 自定义解决方案

CodeIgniter 控制器无法访问

CodeIgniter - 声明全局变量的最佳位置