2012-04-16 71 views
3

我正在构建基于CodeIgniter的CMS。它将“视图”及其数据存储在数据库中,并在需要时收集适当的数据。 正如您可能已经猜到的那样 - 我无法为每个页面生成物理控制器和匹配视图。CodeIgniter - 隐藏控制器

我认为路由会非常方便,因为我不想使用在URL中可见的控制器。不好解释:我正在寻找一种方法来重新分配所有的请求,这些请求不会在物理上存在的控制器上自动生成,而不会出现在URL中。这个控制器当然会处理404错误等。

坏:.com/handler/actual-view/)好:(.com/actual-view/)(无实际视图控制器存在,或者它会被显示。)

我添加了一个404_override路径指向handler/。现在,我只是在寻找一种方法来查找请求的视图(即在.com/actual-view实际视图是我正在寻找)。

我已经试过

$route['404_override/(:any)'] = 'handler/$1'; 

相似,这将彻底删除404覆盖。

回答

0

我的解决方案,在CodeIgniters真棒论坛和StackOverflow的可爱成员的一些指导后,成为将所有404错误路由到我的自定义控制器,我确保它是一个真正的404(无视图OR控制器)。后来在控制器中,我从我的数据库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(); 
    } 
} 
0

你会过得更好的extending the base Router or Controller.

这样,你让你的应用程序要灵活,并且仍然符合CI是如何工作的。

+0

嗯..你愿意详细说明吗? – Zar 2012-04-16 18:18:09

+0

这就是文档的链接。你有具体的问题吗? – Repox 2012-04-16 18:19:15

+0

我其实不了解一般的概念。如何延伸帮助我?我不知道如果我以某种方式无法改变正在定义的加载顺序(控制器 - > 404到控制器 - >自定义 - > 404)......可能是在错误的圈子中思考; - )。 – Zar 2012-04-16 18:23:53

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"; 

为在这里看到,我将所有的网址转移到用户档案中,在前三个网站无法捕捉之后。

+0

这将如何修复实际结束于现有控制器上的请求?您的建议将强制所有请求由特定控制器处理。 – Repox 2012-04-16 18:56:41

+0

不,它会将路径发送到特定的控制器,如果以前的路线无法捕捉的话。我在我的应用程序中自己使用它。 – 2012-04-16 19:01:12

+0

这就是我在找的东西,但是说实话,我宁愿只是使用404_override或类似的东西(请参阅更新的OP)..感谢您的回复:)! – Zar 2012-04-16 19:58:22