2011-06-03 80 views
2

我的应用程序旨在为每个用户提供一个简档页面,第三个分段是用户的ID。CodeIgniter动态URI路由可能吗?

example.com/profile/page/1 

假设用户1为“乔恩·乔维”,使用CI的路由我想生成该URI

example.com/jon_jovi 

是否有可能该用户的ID发送给config/routes.php,运行一个函数来提取用户从数据库1的信息,并插入它像

$route['profile/page/$row->id'] = $row->first_name . '_' . $row->last_name; 

如何做到这一点是非常赞赏的任何想法或建议 - 谢谢。

回答

4

如果您希望“客户端”url格式为base_url/[username],那么您很可能需要抓取用户名一些正则表达式路由,例如$route['([a-zA-z_]+)'] = "profile/page/$1";,然后查看数据库中的该用户。

另一种解决方案是将id附加到url,如base_url/[username]/[id]。为此,正则表达式$route['([a-zA-z_]+)/([0-9+])'] = "profile/page/$2";将传递该id作为Profile控制器页面函数的第一个参数。

检查动态路由的详细信息的文档:http://codeigniter.com/user_guide/general/routing.html

+0

谢谢@ julio,但数据库查找的位置在哪里?这将在routes.php中调用其他地方的函数/模型吗?如果你有时间做一个很棒的例子。 – pepe 2011-06-03 17:17:38

+0

@torr使用第一个路由,如果你访问'base_url/foo',它会调用'Profile'控制器的'page'功能。用户名(在本例中为foo)将作为函数的第一个参数传递。 – JulioC 2011-06-03 18:05:09

5

不知道这需要在你的config/routes.php:为什么你不只是创建一个名称和查找控制器?

编辑:我把它收回。实际上这实际上有点痛苦,特别是因为你希望它活在域名的根目录上(例如,它很容易做example.com/p/{username},但example.com/{username }是凌乱的)。

最简单的方法是使用CodeIgniter 2.0 +的能力来覆盖404处理函数和_remap函数。首先,在的config/routes.php文件文件做到这一点:

$route['404_override'] = 'notfound'; 

然后创建控制器:

<?php if (! defined('BASEPATH')) exit('No direct script access allowed'); 

class NotFound extends CI_Controller 
{ 
    function __construct() 
    { 
    parent::__construct(); 
    } 

    public function _remap($method) 
    { 
    if($this->uri->total_segments() == 1){ 
     // try it out 
     $this->profile(); 
    }else{ 
     show_404($this->uri->uri_string()); 
    } 
    } 

    function profile() 
    { 
    echo "Showing profile for [" . $this->uri->segment(1) . "]"; 
    } 
} 

你必须落实404页,因为这将覆盖它的观点,但任何未映射到现有控制器的请求都会进入此处,并且您可以根据需要分派它们,包括将名称转换为数据库标识。

让我知道,如果这对你有用。

+0

谢谢@femi - 你有什么建议吗?是否可以使用CI中的动态名称命名控制器功能? – pepe 2011-06-03 04:16:30

+0

非常整洁的解决方案。我已经用_example.com/p/{id}_结束了几次,因为我无法弄清楚如何放弃控制器,这样做从来没有想过。下次我一定会记住这一点。 – danneth 2011-06-03 07:29:19

+0

这没有任何意义......我认为这太简单了。按照Julio的例子,使用路线是一个更好的做法。 – tpae 2011-06-03 14:25:07

0

也有类似问题,这几个星期前。我已经复制粘贴下面my answer相关部分:

你要对传入的请求查询扩展CI的路由器和 数据库 为公司名称的列表。如果 URI段与公司名称 相匹配,则您需要使用公司/配置文件方法 提供它。如果它不是 ,您将忽略它并让CI 正常处理它。看看这个主题 发表更多 信息:forum link

在这种情况下,只需换掉“用户名”和“资料/页面”的“公司”和“公司/资料”,使其与您的问题相关。