重新映射Codeigniter控制器


Remapping Codeigniter Controller

我最近一直在玩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, searcharticle功能的Articles控制器,您可能有如下路由:

$route["category/(:any)"] = "articles/category/$1";
$route["search/(:any)"] = "articles/search/$1";
$route["(:any)"] = "articles/article/$1';

你看到如何使用路由从url中完全删除控制器名称了吗?如果URL没有明确说明它是一个分类页面或一个搜索查询,这些规则就会退回到假设页面是一篇文章。然后,您可以检查URL是否有文章,并适当地显示404。