gpt4 book ai didi

php - Codeigniter 路由正则表达式 - 在 Controller /方法名称中使用破折号

转载 作者:IT王子 更新时间:2023-10-29 01:23:20 26 4
gpt4 key购买 nike

我正在寻找一条单线路由,以将虚线 Controller 和方法名称路由到实际的带下划线的 Controller 和方法名称。

例如网址

/controller-name/method-name-which-is-long/

将路由到

/controller_name/method_name_which_is_long/

参见:http://codeigniter.com/forums/viewreply/696690/这让我想到要问:)

最佳答案

这也正是我的要求,我正在使用像

这样的路线
$route['logued/presse-access'] = "logued/presse_access";

在我之前的项目中,我需要创建 300-400 条路由规则,其中大部分是由于破折号到下划线的转换。

对于我的下一个项目,我急切地想避免它。我做了一些快速破解并对其进行了测试,虽然没有在任何实时服务器中使用过,但它对我有用。执行以下操作..

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

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

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

<?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 之类的 url它会通过自动将破折号转换为下划线来调用正确的 Controller 和函数。

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

<?php

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 在 application/config 中定义为 $config['subclass_prefix'] = 'MY_';/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中调用它。如果没有必要,可以删除此代码,但对正常流程没有危害。

关于php - Codeigniter 路由正则表达式 - 在 Controller /方法名称中使用破折号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2428134/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com