获取Kohana的路由信息

为了debug方便,便想着把Konaha的生效路由都输出到一个页面,说闹就闹。

$routes = Route::all();
// 呵呵,尼玛返回值的属性全是 protected 的,还没有get方法,这是作死呢?
// 于是第一个想到是使用反射来获取值
function getProperty($obj, $prop) {
    $refc = new ReflectionClass($obj);
    $refp = $refc->getProperty($prop);
    $refp->setAccessible(true);
    return $refp->getValue($obj);
}

$routeContent = array();
foreach ($routes as $name => $aRoute) {
    $uri = getProperty($aRoute, '_uri');
    $defaults = getProperty($aRoute, '_defaults');
    $action = $defaults['controller'] . '::' . $defaults['action'];
    $routeContent[] = compact('name', 'uri', 'action');
}

var_dump($routeContent);

其实,刚开始的是我没有发现有setAccessible这个函数,这也是php5.3加上去的,想了个变态的方法:

ob_start();
var_dump($routes); // 这边是比较蛋疼的,Kohana的route居然是循环引用自己的,var_dump/var_export都是会到达一定的层级才会停下来
$contents = ob_get_clean();
# ... 然后这边用正则,呵呵

后来在群里问了下 @奇遇 大神,于是黑魔法就出现了,而且这个黑魔法的效率还是 php 的反射类的2倍,但是黑魔法也会产生一些问题,具体可看 官方的文档

function getProtected($obj, $prop) {
    $arr = (array) $obj;
    $key = "\0*\0" . $prop;
    return isset($arr[$key]) ? $arr[$key] : null;
}

function getPrivate($obj, $prop) {
    $arr = (array) $obj;
    $key = "\0" . get_class($obj) . "\0" . $prop;
    return isset($arr[$key]) ? $arr[$key] : null;
}

下面是演示:

PS: Kohana是个奇葩的框架

标签: none

仅有一条评论

  1. 求私信群号

添加新评论