Codeigniter - CMS的最佳路由配置?

时间:2010-09-16 08:42:33

标签: codeigniter content-management-system routing

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

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

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

我已经看到以下解决方案放在routes.php中:

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

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

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

2 个答案:

答案 0 :(得分:3)

你很幸运。我自己开发了一个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.

如果您需要更多说明或可下载的示例代码,请与我们联系。

答案 1 :(得分:3)

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

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

这将向页面控制器发送任何非控制器,方法或有效路径。然后你可以使用你喜欢的任何PHP来显示页面或显示更好的404页面。

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