CodeIgniter动态URI路由可能


CodeIgniter dynamic URI routing possible?

我的应用程序旨在为每个用户提供一个单独的配置文件页面,第三段是用户的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;

任何关于如何做到这一点的想法或建议都将不胜感激-谢谢。

根本不确定这是否需要在config/routes.php中:为什么不创建一个接受名称并进行查找的控制器呢?

编辑:我收回。这样做实际上有点痛苦,特别是因为你希望它生活在域的根上(即,很容易做到example.com/p/{username},但example.com/{username}很混乱)。

最简单的方法是使用CodeIgniter2.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。

如果这对你有用,请告诉我。

如果您希望"客户端"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

几周前也有类似的问题。我已经把我答案的相关部分复制粘贴在下面:

您将希望扩展CI的路由器和在收到请求时查询数据库公司名称列表。如果URI段与公司名称匹配,你会想用你的公司/简介方法。如果是否则,您将忽略它并让CI正常处理。看看这个有关此主题的帖子了解更多信息信息:论坛链接。

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