我正在使用Codeigniter。基本上我想要的是从url中删除Controller名称( Home )。
这些网址看起来像:
http://localhost/mechanicly/Home
http://localhost/mechanicly/Home/about
http://localhost/mechanicly/Home/contactus
现在有两种方法可以删除 Home 控制器:
路由中每个网址的静态定义:
$route['about'] = "Home/about";
$route['contactus'] = "Home/contactus";
我可以在Codeigniter的路线中使用回电:
$route['(.+)'] = function ( $param ) {
if( strpos( $param, "Admin" ) !== false ) {
echo $param;
return "Admin/".$param;
}
else{
echo $param;
return "Home/".$param;
}
};
这个逻辑要好得多,因为它是通用的,我不必每次都为控制器内的新方法创建新的路由。
它适用于主页的客户端控制器,但我有另一个名为管理员的控制器,我想将管理员请求重定向到管理员控制器和主页请求到家庭控制器。
为什么上面的代码适用于Home控制器但返回
未找到
当我验证Admin控制器时?
我正在使用CI版本3.x
答案 0 :(得分:1)
如果你真的想变得疯狂,可以从控制器文件解析方法,并以编程方式创建“静态”方法。
这里的伪代码
$controller_file_contents = file_get_contents('path/to/controller.php');
$controller_methods = function_that_parses_methods_from_file($controller_file_contents);
foreach ($controller_methods as $controller_method) {
$route[$controller_method] = "Home/" . $controller_method;
}
function_that_parses_methods_from_file
如何运作可能会涉及正则表达式,例如function \w+
。如果你采用这种方法,尽量通过将尽可能多的逻辑卸载到模型中来尽量保持控制器尽可能小,这通常是一个好主意。这样,路由器对性能的影响就越小。
或者,您可以使用get_class_methods解析控制器,如果您可以弄清楚如何将控制器加载到路由器内的内存中而不会在需要使用路由器加载控制器时造成冲突或导致过多表现问题。
相当愚蠢,但您在该控制器中创建的每个方法都会自动创建一条路线。
答案 1 :(得分:0)
您可以从数据库
创建菜单(网址)tbl_menu tbl_level
---------- -------------
id id
fk_level level
name dateUP
dateUP active
active
在您的控制器中,您需要按会话或任何地方调用正确的菜单
然后你可以在你的route.php
中有这个$route['(.+)'] = 'int_rout/routing/' . json_encode($1);
在您的控制器Int_rout.php
中public function routing ( $param ) {
$routing = json_decode($param);
$routing = explode('/', $routing);
//$menu -> get menu from model
foreach($menu as $item){
if($routing[0] === $item->name){
//$level -> get level from model
$redirect = $level->level;
}
}
//the final redirect will be like
//admin/user or admin/user/12
//public/us
$params = ( empty($routing[1])) ? '' : '/' . $routing[1];
redirect($redirect . '/' . $routing[0] . $params, 'refresh');
}