获取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是个奇葩的框架
求私信群号