laravel5.1 反射
laravel5.1的路由的闭包和controller中的函数都是通过call_user_func_array这种方式调用的。
其中调用闭包的话,就更简单的了只需要call_user_func_array($function);这种就可以了。
调用controller中function的话, 还是需要使用反射去拿到class的实力,方法的name,方法的参数(以便从Application中注入参数)
前面说了写无用的话。
现在有这样的一个需求:
知道路由的地址及url的path,我想要知道view的更新时间,当然这些view是静态文件,大概就是以下这种:
Route::get('/test', function(){
return view('example');
});
Route::get('test1', 'TestC@show');
class TestC extends Controller
{
public function show()
{
return view('example');
}
}
当然可以在用户请求这些路由的时候去检查这些view的更新时间,但是那样太多了。
我使用了反射去解决这个问题,但是很遗憾的如果路由中出现了闭包的话就不可以了,就想第一个路由那样,在不修改源代码的情况下我是没方法可以办到。
第二个路由的话可以使用下面的代码办到
if (!function_exists('getIndexByArray')) {
/**
* @power在二维数据中搜索一组keyvalue反正该keyvalue的index
* @param $array
* @param $key
* @param $value
* @return int
*/
function getIndexByArray($array, $key, $value)
{
foreach ($array as $k => $v) {
if ($v[$key] == $value) {
return $k;
}
}
return FALSE;
}
}
//下面的数组表示静态页面
$staticPageLink = [
['link' => '/everyoo', 'title' => '关于爱悠', 'time' => '', 'priority' => 0.7],
['link' => '/merchantsjoin', 'title' => '合作加盟', 'time' => '', 'priority' => 0.7],
['link' => '/platform', 'title' => '开放平台', 'time' => '', 'priority' => 0.7],
['link' => '/community', 'title' => '智慧社区', 'time' => '', 'priority' => 0.7],
['link' => '/contact', 'title' => '联系我们', 'time' => '', 'priority' => 0.7],
['link' => '/team', 'title' => '爱悠团队', 'time' => '', 'priority' => 0.7]
];
//处理静态页面的路由,得到这些views文件的更新时间
$route = function () use(&$staticPageLink){
//得到全部的路由
$array = app()['router']->getRoutes()->getRoutes();
$link = array_column($staticPageLink, 'link');
$counter = 0;
$linkSize = count($link);
foreach ($array as $key => $val) {
if ($counter > $linkSize) {
break;
}
//存在信息,并且为xxxController@show格式
if ((in_array($val->getUri(), $link) || in_array('/' . $val->getUri(), $link)) && is_string($val->getAction()['uses'])) {
list($class, $method) = explode('@', $val->getAction()['uses']);
$reflectionMethod = new \ReflectionMethod($class, $method);
$path = $reflectionMethod->invokeArgs(new $class(), [])->getPath();
unset($reflectionMethod);
if (is_file($path)) {
$index = \getIndexByArray($staticPageLink, 'link', '/' . $val->getUri());
if (is_integer($index)) {
$staticPageLink[$index]['time'] = date('Y-m-d H:i:s', filemtime($path));
$staticPageLink[$index]['path'] = $path;
}
}
unset($path);
$counter ++;
}
}
};
$route();
当然现在代码还是有些漏洞的,例如如果controller中function有实参怎么办?这种情况我是没有去处理的。
ps:加油
浙公网安备 33010602011771号