我正在尝试创建基于注释的路由系统(类似于Recess Framework)。
<?php
class MyController extends ActionController {
/** !Route GET /hello/$firstname/$lastname **/
public function helloAction($firstname, $lastname) {
echo('Hello '.$firstname.' '.$lastname);
}
}
?>
如果我去http://domain.com/hello/James/Bond我
Hello James Bond
所以我有两个问题:
1)这是个好主意吗?利弊与集中路由系统(如Zend Framework)。也许我没有看到我后来使用这种路由技术出现的问题。
2)如果路线中有正则表达式,如何检查重复路线
<?php
class MyController extends ActionController {
/**
*!Route GET /test/$id = {
* id: [a-z0-9]
*}
**/
public function testAction($id) {
echo($id);
}
/**
*!Route GET /test/$id = {
* id: [0-9a-z]
*}
**/
public function otherTestAction($id) {
echo($id);
}
}
?>
我有两条路线:/test/[a-z0-9]/
和/test/[0-9a-z]/
如果我转到http://domain.com/test/a12/
这两条路线都有效。
谢谢:)
答案 0 :(得分:2)
尝试使用Java annotation format,这应该更容易统一解析。
它看起来像这样:
<?php
class MyController extends ActionController {
/**
@Route(get=/hello/$firstname/$lastname)
@OtherVal(var1=2,var2=foo)
@OtherVal2
**/
public function helloAction($firstname, $lastname) {
echo('Hello '.$firstname.' '.$lastname);
}
}
?>
使用以下正则表达式解析注释:
@(?P<annotation>[A-Za-z0-9_]*)(\((?P<params>[^\)]*))?
当然,尽可能缓存这些内容以避免重复解析。
答案 1 :(得分:1)
缺点:
如果方法签名和映射始终与示例相关,则可以使用反射来提取映射,其中 helloAction 被选为 / hello 和每个方法参数是定义它的顺序的子目录。
然后注释不需要复制URL,只需要该方法是端点的事实,如下所示:
<?php
class MyController extends ActionController {
/** !endpoint(method=GET) **/
public function helloAction($firstname, $lastname) {
echo('Hello '.$firstname.' '.$lastname);
}
}
答案 2 :(得分:0)
我认为这是一个好主意/解耦代码和入口点似乎随处可见
通常你不会检查它:匹配胜利的第一个。
答案 3 :(得分:0)
这样做是个好主意,只要您在生产中缓存已编译的路径。在路由时解析文件会产生相关成本,因此您希望在不进行开发时避免使用该文件。
至于检查重复项,请不要通过比较声明进行检查。只需检查路由时间。如果两个规则匹配,则抛出DuplicateRouteException
。因此,在路由http://domain.com/test/a12/
时,您将看到两个路由都有效并抛出异常。