【发布时间】:2011-08-15 22:31:02
【问题描述】:
我需要一种使用配置语法快速将 url 路由到 Class->Method() 调用的方法,而不是对每种情况都进行编程。
我有一个网络工具,它接受一个 url 并使用它来确定 url 所指的对象的类、要使用的类方法以及该方法的参数。我正在使用 .htaccess 将所有请求引导到 index.php,因此我从 $_SERVER['PATH_INFO'] 读取路径并从那里过滤并分解它以获取各个组件。
因此 www.example.com/user/view/12345 将创建一个用户控制器并调用将显示用户配置文件的视图函数。实际上,它将执行以下操作:
$url = explode("/",trim($_SERVER['PATH_INFO'],"/");
$class = $url[0] . "_Controller";
$page = new $class;
echo call_user_func_array(array($page, $url[1]), $url);
现在这当然是过于简单化了,还有很多其他的活动部分没有在这里显示,__autoload()、页面模板系统等,但你明白了。 url 是 domain_name/class/function/[arg1]/[arg2]/[arg3]/... 并且代码可以快速确定渲染页面所需的内容。
不幸的是,网站需要匹配政策规定的 api 规则。根据政策,网址应该是:
domain_name/class/entityid/function_alias/[arg1]/[arg2]/[arg3]/... 对于影响特定实体的工具
domain_name/class/function_alias/[arg1]/[arg2]/[arg3]/... 用于不绑定到单个实体的工具
我已经解决了这个问题,但它很乱。我没有为 $url[0] 中的类调用 $url[1] 中的函数并将剩余的参数传递给它,而是从 $url[0] 确定对象类,实例化它,然后将 url 传递给对象的route($url) 方法。从那里我得到了 switch 和 if 语句的混乱组合,将 url 转换为正确的类方法。
我需要的是某种配置文件或路由表,我可以在其中定义 url 的样子。我知道有 CMS 会做这种事情。
"user/$1" => user/view/$1
"user/add" => user/add
"user/$1/edit" => user/edit/$1
"user/$1/key/$2" => user/edit_key/$1/$2
我需要的是一种语法和算法,可以快速确定 url 的实际目标类和方法是什么,对其进行实例化,并将必要的 url 值传递给它。
【问题讨论】:
-
是
entityid总是一个整数吗?