我想在URL中的控制器段之前传递一些站点范围的验证变量。
示例:
默认网址为:
www.mysite.com/controller/method/variable/
有时候我也想要这样的网址来引用用户创建的这个网站的子配置(主题,菜单......),这样用户可以很好地分享这个网站的网址,而其他人会看到该网站虽然他的自定义配置。
www.mysite.com/username/controller/method/variable
此处用户名是 base_url 的自定义部分。它应该针对数据库进行验证并设置为会话变量,以便稍后在我的控制器中使用它并更改主题。此外,在网址输入网址后,网站上的所有链接都会以 base_url 开始使用www.mysite.com/username
。
解决此问题的一种方法是将其路由:
controller/method/variable_name1/variable_value1/user_conf/username
...并将实现添加到我项目中的每个控制器。但这不是一个优雅的解决方案。
答案 0 :(得分:2)
这就是你所追求的:
$route['(:any)/(:any)'] = '$2/$1';
其中所有函数定义都将用户名作为最后一个参数:
class Controller{function page(var1, var2, ..., varn, username){}}
或者,如果您只想在一个特定页面上进行,您可以执行以下操作:
$route['(:any)/controller/page/(:any)'] = 'controller/page/$2/$1'; //This will work for the above class.
或者,如果您想要它用于控制器中的许多功能,您可以这样做:
$route['(:any)/controller/([func1|func2|funcn]+)/(:any)'] = 'controller/$2/$3/$1';
答案 1 :(得分:1)
在解决这个问题一天后,我最终将自定义路由器类添加到我的项目中。我在CodeIgniter 2.0中工作,因此该文件的位置应为application/core/MY_Router.php
我的代码如下:
class MY_Router extends CI_Router {
// --------------------------------------------------------------------
/**
* OVERRIDE
*
* Validates the supplied segments. Attempts to determine the path to
* the controller.
*
* @access private
* @param array
* @return array
*/
function _validate_request($segments)
{
if (count($segments) == 0)
{
return $segments;
}
// Does the requested controller exist in the root folder?
if (file_exists(APPPATH.'controllers/'.$segments[0].EXT))
{
return $segments;
}
$users["username"] = 1;
$users["minu_pood"] = 2;
// $users[...] = ...;
// ...
// Basically here I load all the
// possbile username values from DB, memcache, filesystem, ...
if (isset($users[$segments[0]])) {
// If my segments[0] is in this set
// then do the session actions or add cookie in my cast.
setcookie('username_is', $segments[0], time() + (86400 * 7));
// After that remove this segment so
// rounter could search for controller!
array_shift($segments);
return $segments;
}
// So segments[0] was not a controller and also not a username...
// Nothing else to do at this point but show a 404
show_404($segments[0]);
}
}