codeigniter中的_remap或URI路由

时间:2012-08-20 10:23:56

标签: php codeigniter uri url-routing remap

我目前正在研究PHP框架Codeigniter,并了解到目前为止的主要概念,直到控制器部分关于_remapping。我了解_remapping如何覆盖URI上的控制器方法的行为,例如从www.example.com/about_me到www.example.com/about-me。我想听到的是人们对使用什么方法的看法 - _mamapping方法或URI路由方法?我只是问这个,因为在研究这些方法时,有人在重新映射函数方面遇到困难,他们被指示使用URI路由。

所以..

1)使用的主要常用方法和专业方法是什么? 2)最好从PHP5 CI版本2开始使用URI路由吗?

我很高兴听到你的意见!

3 个答案:

答案 0 :(得分:1)

如果要更改默认CI路由的行为,则应使用_remap。

例如,如果设置维护并希望阻止任何特定控制器运行,则可以使用_remap()函数加载视图,而不会调用任何其他方法。

另一个例子是你的URI中有多个方法。例如:

site.com/category/PHP
site.com/category/Javascript
site.com/category/ActionScript

您的控制器为category,但方法无限制。 你可以在这里使用Colin Williams调用的_remap方法: http://codeigniter.com/forums/viewthread/135187/

 function _remap($method)
{
  $param_offset = 2;

  // Default to index
  if ( ! method_exists($this, $method))
  {
    // We need one more param
    $param_offset = 1;
    $method = 'index';
  }

  // Since all we get is $method, load up everything else in the URI
  $params = array_slice($this->uri->rsegment_array(), $param_offset);

  // Call the determined method with all params
  call_user_func_array(array($this, $method), $params);
}  

总而言之,如果当前CI的路由适合您的项目,请不要使用_remap()方法。

答案 1 :(得分:1)

假设您不想使用index控制器的Categories(即http://www.yourdomain.com/category)操作,则可以使用路由。

$route['category/(:any)'] = 'category/view/$1';

然后,您只需在Category控制器中使用View操作即可接收类别名称,即PHP。

http://www.yourdomain.com/category/PHP

function View($Tag)
{
    var_dump($Tag);
}

如果您仍希望在控制器中访问索引操作,仍可以通过http://www.yourdomain.com/category/index

访问它

答案 2 :(得分:1)

$default_controller = "Home";

$language_alias = array('gr','fr');

$controller_exceptions = array('signup');

$route['default_controller'] = $default_controller;

$route["^(".implode('|', $language_alias).")/(".implode('|', $controller_exceptions).")(.*)"] = '$2';

$route["^(".implode('|', $language_alias).")?/(.*)"] = $default_controller.'/$2';

$route["^((?!\b".implode('\b|\b', $controller_exceptions)."\b).*)$"] = $default_controller.'/$1';

foreach($language_alias as $language)

$route[$language] = $default_controller.'/index';