ci 控制器 目录my_router.php,Codeigniter路由正则表达式-在控制器/方法名称中使用破折号...

这篇博客介绍了如何在CodeIgniter框架中自定义路由器,以便自动将URL中的短划线转换为下划线,从而简化控制器和方法的调用。通过创建MY_Router类并覆盖默认的路由设置,用户现在可以使用包含短划线的URL,而系统会自动找到正确的控制器和方法。这种方法避免了手动创建大量路由规则的繁琐工作。
摘要由CSDN通过智能技术生成

这也正是我的要求,而且我使用了类似

$route['logued/presse-access'] = "logued/presse_access";

在我之前的项目中,我需要创建300-400路由规则,其中大多数是由于短划线到下划线的转换。

对于我的下一个项目,我热切希望避免。尽管没有在任何实时服务器中使用它,但我已经对其进行了一些快速的修改并对其进行了测试,但是它对我有用。请执行下列操作..

确保您的system / application / config / config.php中的subclass_prefix如下所示

$config['subclass_prefix'] = 'MY_';

然后在system / application / libraries目录中上传一个名为MY_Router.php的文件。

class MY_Router extends CI_Router {

function set_class($class)

{

//$this->class = $class;

$this->class = str_replace('-', '_', $class);

//echo 'class:'.$this->class;

}

function set_method($method)

{

// $this->method = $method;

$this->method = str_replace('-', '_', $method);

}

function _validate_request($segments)

{

// Does the requested controller exist in the root folder?

if (file_exists(APPPATH.'controllers/'.str_replace('-', '_', $segments[0]).EXT))

{

return $segments;

}

// Is the controller in a sub-folder?

if (is_dir(APPPATH.'controllers/'.$segments[0]))

{

// Set the directory and remove it from the segment array

$this->set_directory($segments[0]);

$segments = array_slice($segments, 1);

if (count($segments) > 0)

{

// Does the requested controller exist in the sub-folder?

if ( ! file_exists(APPPATH.'controllers/'.$this->fetch_directory().str_replace('-', '_', $segments[0]).EXT))

{

show_404($this->fetch_directory().$segments[0]);

}

}

else

{

$this->set_class($this->default_controller);

$this->set_method('index');

// Does the default controller exist in the sub-folder?

if ( ! file_exists(APPPATH.'controllers/'.$this->fetch_directory().$this->default_controller.EXT))

{

$this->directory = '';

return array();

}

}

return $segments;

}

// Can't find the requested controller...

show_404($segments[0]);

}

}

现在,您可以自由使用网址,例如http://example.com/logued/presse-

access,它将通过自动将破折号转换为下划线来调用适当的控制器和功能。

编辑: 这是我们的Codeigniter 2解决方案,它将覆盖新的CI_Router函数:

class MY_Router extends CI_Router {

function set_class($class)

{

$this->class = str_replace('-', '_', $class);

}

function set_method($method)

{

$this->method = str_replace('-', '_', $method);

}

function set_directory($dir) {

$this->directory = $dir.'/';

}

function _validate_request($segments)

{

if (count($segments) == 0)

{

return $segments;

}

// Does the requested controller exist in the root folder?

if (file_exists(APPPATH.'controllers/'.str_replace('-', '_', $segments[0]).'.php'))

{

return $segments;

}

// Is the controller in a sub-folder?

if (is_dir(APPPATH.'controllers/'.$segments[0]))

{

// Set the directory and remove it from the segment array

$this->set_directory($segments[0]);

$segments = array_slice($segments, 1);

while(count($segments) > 0 && is_dir(APPPATH.'controllers/'.$this->directory.$segments[0]))

{

// Set the directory and remove it from the segment array

$this->set_directory($this->directory . $segments[0]);

$segments = array_slice($segments, 1);

}

if (count($segments) > 0)

{

// Does the requested controller exist in the sub-folder?

if ( ! file_exists(APPPATH.'controllers/'.$this->fetch_directory().str_replace('-', '_', $segments[0]).'.php'))

{

if ( ! empty($this->routes['404_override']))

{

$x = explode('/', $this->routes['404_override']);

$this->set_directory('');

$this->set_class($x[0]);

$this->set_method(isset($x[1]) ? $x[1] : 'index');

return $x;

}

else

{

show_404($this->fetch_directory().$segments[0]);

}

}

}

else

{

// Is the method being specified in the route?

if (strpos($this->default_controller, '/') !== FALSE)

{

$x = explode('/', $this->default_controller);

$this->set_class($x[0]);

$this->set_method($x[1]);

}

else

{

$this->set_class($this->default_controller);

$this->set_method('index');

}

// Does the default controller exist in the sub-folder?

if ( ! file_exists(APPPATH.'controllers/'.$this->fetch_directory().$this->default_controller.'.php'))

{

$this->directory = '';

return array();

}

}

return $segments;

}

// If we've gotten this far it means that the URI does not correlate to a valid

// controller class. We will now see if there is an override

if ( ! empty($this->routes['404_override']))

{

$x = explode('/', $this->routes['404_override']);

$this->set_class($x[0]);

$this->set_method(isset($x[1]) ? $x[1] : 'index');

return $x;

}

// Nothing else to do at this point but show a 404

show_404($segments[0]);

}

}

现在必须放置该文件,例如application / core /

MY_Router.php,并确保他具有subclass_prefix的定义如$config['subclass_prefix'] =

'MY_';在application / config / config.php中

在方法中添加了几行额外的代码_validate_request():

while(count($segments) > 0 && is_dir(APPPATH.'controllers/'.$this->directory.$segments[0]))

{

// Set the directory and remove it from the segment array

$this->set_directory($this->directory . $segments[0]);

$segments = array_slice($segments, 1);

}

它用于使人可以使用controllers目录内的多层子目录,而通常我们可以在controllers文件夹内使用单层子目录并可以在url中调用它。如果不需要,可以删除此代码,但对正常流程没有危害。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值