Codeigniter-CMS的最佳路由配置?

Codeigniter-CMS的最佳路由配置?,codeigniter,content-management-system,routing,Codeigniter,Content Management System,Routing,我想在Codeigniter中创建一个自定义CMS,我需要一种机制将常规页面路由到默认控制器-例如: mydomain.com/about mydomain.com/services/maintenance 这些将通过我的pagehandler控制器路由。Codeigniter中的默认路由行为当然是路由到匹配的控制器和方法,因此在上面的示例中,需要一个About控制器和一个Services控制器。这显然不是一个切实可行甚至不明智的办法 我在routes.php中看到了以下解决方案: $rout

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

mydomain.com/about
mydomain.com/services/maintenance
这些将通过我的pagehandler控制器路由。Codeigniter中的默认路由行为当然是路由到匹配的控制器和方法,因此在上面的示例中,需要一个About控制器和一个Services控制器。这显然不是一个切实可行甚至不明智的办法

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

$route['^(?!admin|products).*'] = "pagehandler/$0";
但我相信这也带来了问题。例如,它只是在请求uri中查找“产品”,如果找到,则路由到产品控制器-但是如果我们将服务/产品作为CMS页面会怎么样?然后是否将其路由到产品控制器


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

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

您的URL可以通过以下方式格式化:

<?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.

}
?>
-没有类别的顶级页面
-包含父类别的页面
-包含类别和子类别的页面

在my pages controller中,我使用了_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.

}
?>

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

如果您使用CodeIgniter 2.0(已稳定使用数月),那么您可以使用:

$route['404_override'] = 'pages';
这会将任何不是控制器、方法或有效路由的内容发送到pages控制器。然后,您可以使用任何PHP来显示页面或显示更好的404页面


给我读一本指南,解释你是如何做到的。此外,您可能会对使用现有的CMS感兴趣,例如现在接近最终版本1.0且拥有大量追随者的CMS。

鉴于您在帖子中提供的信息,很难确切说出最佳方法是什么。你所说的“CMS内容”到底是什么意思?您希望您的URI在不同情况下如何显示?我知道您可能很清楚自己想要做什么,但我们需要更具体的示例来帮助您。老实说,我从未在我的CI应用程序中使用任何路由。这样做的问题是您必须将WAAAY设置为多个路由,只需升级到CI 2并使用404_覆盖:)