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 的最佳路由配置?的主要内容,如果未能解决你的问题,请参考以下文章