CodeIgniter动态URI路由可能吗?

时间:2011-06-03 03:46:41

标签: php codeigniter routing uri

我的应用程序旨在为每个用户提供一个个人资料页面,第三个细分是用户的ID。

example.com/profile/page/1

假设用户1是“Jon Jovi”,使用CI的路由我想生成这个URI

example.com/jon_jovi

是否可以将此用户的ID发送到config/routes.php,运行一个函数从数据库中提取用户1的信息并插入

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

对于如何做到这一点的任何想法或建议都非常感谢 - 谢谢。

3 个答案:

答案 0 :(得分: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页面的视图,因为这会覆盖它,但是任何未映射到现有控制器的请求都会在此处进行,您可以根据需要调度它们,包括将名称转换为数据库ID

请告诉我这是否适合您。

答案 1 :(得分:4)

如果您希望“客户端”网址采用base_url/[username]格式,您可能需要获取一些正则表达式路由的用户名,例如$route['([a-zA-z_]+)'] = "profile/page/$1";,并在您的数据库中查找该用户。

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

查看文档以获取有关动态路由的更多详细信息:http://codeigniter.com/user_guide/general/routing.html

答案 2 :(得分:0)

几周前,有一个类似的问题。我已复制粘贴下面my answer的相关部分:

  

你想要扩展CI的路由器和   在传入的请求上查询数据库   用于公司名称列表。如果   URI段与公司名称匹配,   你会想用你的服务来提供它   公司/简介方法。如果是的话   不,你会忽略它,让CI   正常处理它。看看这个   关于这个主题的帖子了解更多   信息:forum link

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