我最近一直在玩Codeigniter,我知道你可以在控制器中重新映射一个函数,这样你就可以有动态的漂亮的URL。
我只是想知道控制器也可以这样做吗?我的意思是如果我调用http://example.com/stack
,它会寻找一个名为stack
的控制器,如果没有找到,它会调用一个固定/重新映射的控制器,在那里我可以处理它。
这能做到吗?
也许这能帮到你:
function _remap( $method )
{
/// $method contains the second segment of your URI
switch( $method )
{
case 'about-me':
$this->about_me();
break;
case 'successful':
$this->display_successful_message();
break;
default:
$this->page_not_found();
break;
}
}
是的,这是可以做到的,你可以通过使用uri路由实现它。
在你的application/config/routes.php
中,你可以设置自定义路由来重新映射uri。
已经提供了2个,默认的一个(以防没有调用控制器)和404错误路由。
现在,如果你想添加自定义路由,你只需要在这两个默认值下添加它们,记住它们是按照它们呈现的顺序执行的。
比如说,你想把'stack'重新映射到另一个控制器,只需使用:
$routes['stack'] = 'othercontroller';
这样,当你访问'stack'时,它将被自动映射到'othercontroller',如果不存在…你会得到相同的404错误。如果您使用.htaccess隐藏index.php,请记住将其插入$config['index_page'] = 'index.php';
。
如果你想实现的是,相反,是一个自定义的错误信息,当一个控制器找不到,只需覆盖404路由已经建议@Juris Malinens,使用您的自定义默认控制器来处理这种情况
$route['404_override'] = 'customcontroller';
你可以使用。htaccess或config/routes.php来实现这一点- Codeigniter是非常灵活的;-)
如果没有找到控制器,请使用$route['404_override'];在config/routes.php
application/config/routes.php文件将是执行此操作的合适位置。Juris提到的404_override仅在CI 2中可用。如果你有一个旧版本(我不知道,你可能在一个遗留系统上工作,或者将来不得不这样做)。
注意,你可以用它做的不仅仅是"重新映射"控制器。这些路由接受像htaccess重写规则这样的正则表达式模式;还有一些CI模式,它们基本上只是正则表达式的更易于人类阅读的别名。假设您有一个具有category
, search
和article
功能的Articles
控制器,您可能有如下路由:
$route["category/(:any)"] = "articles/category/$1";
$route["search/(:any)"] = "articles/search/$1";
$route["(:any)"] = "articles/article/$1';
你看到如何使用路由从url中完全删除控制器名称了吗?如果URL没有明确说明它是一个分类页面或一个搜索查询,这些规则就会退回到假设页面是一篇文章。然后,您可以检查URL是否有文章,并适当地显示404。