我想产生一个菜单中的链接
我与引用一个JSON文件,我试图生成菜单
我使用这个函数调用dnd
进行调试
function dnd($data) //debug function
{
echo '<pre>';
var_dump($data);
echo '</pre>';
die();}
我有这样的功能:
public static function getMenu($menu)
{
$menuAry = [];
$menuFile = file_get_contents(ROOT . DS . 'app' . DS . $menu . '.json');
$acl = json_decode($menuFile, true);
foreach($acl as $key => $val)
{
if(is_array($val)) {
$sub = [];
foreach($val as $k => $v) {
if($k == 'separator' && !empty($sub)) {
$sub[$k] = '';
continue;
}else if($finalVal = self::get_link($v)) {
$sub[$k] = $finalVal;
}
}
if(!empty($sub))
{
$menuAry[$key] = $sub;
}
}
else
{
if($finalVal = self::get_link($val))
{
$menuAry[$key] = $finalVal;
}
}
}
return $menuAry;
}
而get_link函数看起来像:
private static function get_link($val) {
//check if external link
if(preg_match('/https?:\/\//', $val) == 1) {
return $val;
} else {
$uAry = explode(DS, $val);
$controller_name = ucwords($uAry[0]);
$action_name = (isset($uAry[1]))? $uAry[1] : '';
if(Self::hasAccess($controller_name, $action_name)) {
return PROOT . $val;
}
return false;
}
}
如果我想要在foreach之前dnd
ACL中,我得到这个:
array(6) {
["Home"]=>
string(4) "home"
["Tools"]=>
array(5) {
["My Tools"]=>
string(5) "tools"
["Tool 1"]=>
string(11) "tools/first"
["Tool 2"]=>
string(12) "tools/action"
["separator"]=>
string(0) ""
["Tool 3"]=>
string(11) "tools/third"
}
["Google"]=>
string(23) "https://www.google.com/"
["PHP Docs"]=>
string(25) "https://php.net/manual/en"
["Login"]=>
string(14) "register/login"
["Logout"]=>
string(15) "register/logout"
}
而且我不知道为什么它会跳过工具的一部分,因为我得到这个结尾,因为它应该在开始添加/framework/
作为ROOT
是\framework\
,它跳过工具,最后,我已经看过了YouTube导览10时间和下载的源,但似乎没有任何解决它
array(3) {
["Home"]=>
string(15) "/framework/home"
["Google"]=>
string(23) "https://www.google.com/"
["PHP Docs"]=>
string(25) "https://php.net/manual/en"
}
acl.json
{
"Guest" : {
"denied" : {},
"Home" : ["*"],
"Register" : ["login", "register"],
"Restricted" : ["*"]
},
"LoggedIn" : {
"denied" : {
"Register" : ["login", "register"]
},
"Register" : ["logout"],
"Tools" : ["*"]
}
}
menu_acl.json
{
"Home" : "home",
"Tools":
{
"My Tools" :"tools",
"Tool 1" :"tools/first",
"Tool 2" :"tools/action",
"separator" :"",
"Tool 3" :"tools/third"
},
"Google" :"https://www.google.com/",
"PHP Docs" :"https://php.net/manual/en",
"Login" :"register/login",
"Logout" :"register/logout"
}
(如在评论讨论)
有两个不同的问题:
DS
分裂的数组项到控制器和行动,但在Linux / UNIX主机,其中目录分隔符/
相同的JSON网站所使用的这只作品描述。分裂已经由一个普通'/'
来完成(如user741在YouTube上他的评论中指出)tools
选项仅授予,因此它没有列出。这样的事情发生在我身上所有的时间,这就是为什么那么多人喜欢做结对编程 - 更可能的一个人注视他的思想比两个人都一个办法注视同一个;-)