我正在构建基于CodeIgniter的CMS。它存储"观点"并将其数据存储在数据库中,并在需要时收集正确的数据。 您可能已经猜到了 - 我无法为每个页面生成物理控制器和匹配视图。
我认为路线会非常方便,因为我不想使用在网址中可见的控制器。解释不清楚:我正在寻找一种方法,将所有不会在物理上存在的控制器上结束的请求重新分配给自定义控制器 - 而不会出现在网址中。此控制器当然,会处理404错误等。
不好:.com/handler/actual-view/)
好:(.com/actual-view/)
(不存在实际视图控制器,或者显示它)
我添加了一条指向404_override
的{{1}}路线。现在,我只想找到一种方法来查找所请求的视图(即handler/
实际视图是我正在寻找的内容。
我已经尝试了
.com/actual-view
和类似的,将完全删除404覆盖。
答案 0 :(得分:0)
你会更好extending the base Router or Controller.
通过这样做,您可以使应用程序变得灵活,并且仍然符合CI的工作方式。
答案 1 :(得分:0)
您需要在route.php配置文件中定义所有有效路由,然后在最后一行定义
$routes["(:any)"] = "specific controller path";
如果我举一个例子:
$route['u/(:any)/account'] = "user_profile/account/$1";
$route['u/(:any)/settings'] = "user_profile/settings/$1";
$route['u/(:any)/messages'] = "user_profile/messages/$1";
$route['u/(:any)'] = "user_profile/index/$1";
如此处所示,我将所有网址转移到用户个人资料,前三个网站无法抓住它。
答案 2 :(得分:0)
我的解决方案,在CodeIgniters精彩的论坛和StackOverflow的可爱成员的一些指导下,成为将所有404错误路由到我的自定义控制器,在那里我确保它是真正的404(没有视图或控制器)。稍后在控制器中,我从数据库URI字符串中收集了我需要的其他信息:
//Route
$route['404_override'] = 'start/handler';
//Controller
function handler($path = false) {
//Gather the URI from the URL-helper
$uri_string = uri_string();
//Ensure we only get the desired view and not its arguments
if(stripos($uri_string, "/") !== false) {
//Split and gather the first piece
$pieces = explode("/", $uri_string);
$desired_view = $pieces[0];
} else {
$desired_view = $uri_string;
}
//Check if there's any view under this alias
if($this->site->is_custom_view($desired_view)) {
//There is: ensure that the view has something to show
if(!$this->site->view_has_data($desired_view)) {
//No data to show, throw an error message
show_custom_error('no_view_data');
} else {
//Found the views data: show it
}
} else {
//No view to show, lets go with 404
show_custom_404();
}
}