我正在基于CodeIgniter Framework(v 2.1.4)创建一个小应用程序。我已经配置了整个代码,所以我不必在URL上写“index.php”部分,而且我也将默认控制器配置为不在URL中写入。我还确保每个控制器的每个方法都链接到一个视图,其中div能够显示错误消息,这要归功于'$ this-> session-> flashdata()'方法。
所以,让我们说,我的默认控制器被称为'inicio'。为了从我的本地服务器运行它,我转到我的浏览器并在地址栏中写下以下行:
URL: http://localhost/vga/
并配置了application / config / routes.php,这样我就可以避免不必要的写入
$route['default_controller'] = 'inicio';
$route['404_override'] = '';
$route['inicio'] = '';
我把.htaccess的设置
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .* index.php/$0 [PT,L]
就是这样。这将把我带到默认控制器,它由会话管理器控制,迫使我填写登录表单,以便访问该页面的内部部分。
URL: http://localhost/vga/acceso
此登录信息包含指向基本注册表单的链接,该表单就像魅力一样。
URL: http://localhost/vga/acceso/registro
甚至还有一个配置文件控制器,它可以让我查看和编辑自己的配置文件。好东西,我甚至不需要URI段参数,因为ID是由会话传递的。
我没有触及application / config / routes.php,除了默认控制器的配置。到目前为止,一切都很酷。
现在,我的头疼了。
我创建了一个新控制器来控制此页面中的“角色”。该控制器有3种方法:
class Roles extends CI_Controller {
function index() {}
function editar() {}
function usuarios() {}
}
每种方法背后的基本思想都很简单。
'index'应列出此Web系统中存在的角色(例如admin,user,ect),并告诉我有多少用户,按角色分类。 'editar'应该让我编辑每个角色的基本方面。 'usuarios'应该显示列出每个角色中存在的用户。
我编写了每种方法,它们工作得很好。这个问题依赖于一个该死的flashdata,它在奇怪的情况下显示,特别是在'editar'和'usuarios'方法中。
为什么他们很特别?那么,与其他所有方法相比,它们拥有3个URI段:控制器,方法和一个参数。
这是情景:
'editar'和'usuarios'都有一些共同的代码行:
/*
I'll be trying to edit a specific numeric entry,
and force it to be zero in case of empty segment.
The page should be redirected in this case.
*/
$id = $this->uri->segment(3, 0);
if( $id == 0 ){
$this->session->set_flashdata('message', 'Error #X' ); /* Only these controllers have this Error Code */
redirect( 'roles' , 'refresh');
}
看起来不错吧?嗯,问题是,当我在'角色'索引并转到'roles / usuario / 1'(现有数据)或'roles / editar / 1'(也是现有数据)时,那些页面按预期显示清洁。当我在浏览器上按“刷新”,或者从这一点开始转到任何页面时,麻烦就来了......因为在所有情况下系统都会抛出“错误#X”消息......并且页面未被重定向,正如我在$ id = 0的情况下所期望的那样。所以,我假设流程绕过if语句,足以设置$ this-> session-> flashdata('message')变量,但不是足以命令重定向方法。
这里非常头痛。然后,我开始思考一下,并尝试进一步利用application / config / routes.php功能,所以我设置了一些规则,文件变成这样:
$route['default_controller'] = 'inicio';
$route['404_override'] = '';
$route['inicio'] = '';
$route['roles_usuarios/(:any)'] = 'roles/usuarios/$1';
$route['roles_editar/(:any)'] = 'roles/editar/$1';
瞧,该死的消息在奇怪的情况下停止显示,只显示我希望显示的时间(当$ this-> uri-> segment(3)没有插入URL时,或者当如果将其用作数据库查询的参数,则我的数据库中不存在其值。
$ this-> uri->段(3)如何绕过if语句?
我设法发现这可能是一个路由问题,因为更换
$route['roles_usuarios/(:any)'] = 'roles/usuarios/$1';
$route['roles_editar/(:any)'] = 'roles/editar/$1';
通过
$route['roles/usuarios/(:any)'] = 'roles/usuarios/$1';
$route['roles/editar/(:any)'] = 'roles/editar/$1';
再次触发异常,我真的不想在我的网址中使用下划线。
我很乐意感谢你们在这里伸出援助之手。
更新:解决了它。让我分享一下我的知识。
使用@AdrienXL的指南,我设法为htaccess找到了一种工作方式,其中包括在routes.php中显示3段uri路由的代码行,并为其他任何路由设置通用规则之前的角色控制器。
现在是这些文件:
的.htaccess
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]
routes.php文件
$route['default_controller'] = 'inicio';
$route['404_override'] = '';
$route['inicio'] = '';
$route['roles/editar/(:num)'] = 'roles/editar/$1';
$route['roles/usuarios/(:num)'] = 'roles/usuarios/$1';
$route['roles/(:any)'] = 'roles/index';
现在系统运行完美。谢谢!
答案 0 :(得分:1)
更新:解决了它。让我分享一下我的知识。
使用@AdrienXL的指南,我设法为htaccess找到了一种工作方式,其中包括在routes.php中显示3段uri路由的代码行,并为其他任何路由设置通用规则之前的角色控制器。
现在是这些文件:
的.htaccess
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]
routes.php文件
$route['default_controller'] = 'inicio';
$route['404_override'] = '';
$route['inicio'] = '';
$route['roles/editar/(:num)'] = 'roles/editar/$1';
$route['roles/usuarios/(:num)'] = 'roles/usuarios/$1';
$route['roles/(:any)'] = 'roles/index';
现在系统运行完美。谢谢!