在CodeIgniter中在控制器URI段之前传递变量

时间:2011-11-22 21:08:12

标签: codeigniter url-routing uri

我想在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

...并将实现添加到我项目中的每个控制器。但这不是一个优雅的解决方案。

2 个答案:

答案 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]);

}

}