我的应用程序旨在为每个用户提供一个单独的配置文件页面,第三段是用户的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"个人资料/页面",使其与您的问题相关。