我尝试创建一个xml文件来存储某个角色和区域内的用户应该能够看到的项目列表,然后用PHP解析它以检索此列表。
因此,如果用户从某个$区域登录,则首先检查该区域,如果该区域不在xml内,则忽略该区域。
用户一次只能在一个$区域内,所以如果当前的$ area匹配我,那么需要检查他们当前的$ role是否匹配,用户可以有多个角色。
然后应该为用户可以看到的项目构建一个列表,只包含唯一的项目。
XML结构如下所示:
<?xml version="1.0"?>
<permissions>
<area name="accounts">
<role name="user">
<item>item1</item>
<item>item2</item>
</role>
<role name="manager">
<item>item1</item>
</role>
</area>
<area name="records">
<role name="user">
<item>item1</item>
<item>item2</item>
</role>
</area>
</permissions>
我已经开始使用xpath来获取匹配区域:
$matchingAreas = $xml->xpath('/permissions/area[@name="' . $area . '"]');
然后,如果$ matchingAreas是&gt; 0我真的不知道如何继续,我的想法是使用匹配角色列表的xpath项来构建对象:
foreach($roles as $role){
$roleNodes += $matchingAreas->xpath('/permissions/area/role[@name="' . $role . '"]');
}
我是PHP的新手,这开始显得凌乱/低效,所以我希望有人可以告诉我携带这样的东西的最佳方式?
由于
答案 0 :(得分:2)
您可以使用单个XPath轻松完成此操作:
$area = "records";
$role = "user";
$itemQuery = sprintf(
'/permissions/area[@name="%s"]/role[@name="%s"]/item',
$area,
$role
);
$permissions = simplexml_load_string($string);
foreach ($permissions->xpath($itemQuery) as $item) {
echo $item->asXML(), PHP_EOL;
}
将输出
<item>item1</item>
<item>item2</item>
如果用户可以拥有多个角色,则可以执行
$area = "accounts";
$role = "manager user";
$itemQuery = sprintf(
'/permissions/area[@name="%s"]/role[contains("%s", @name)]/item',
$area,
$role
);
$permissions = simplexml_load_string($string);
foreach (array_unique($permissions->xpath($itemQuery)) as $item) {
echo $item->asXML(), PHP_EOL;
}
由于调用array_unique
,输出将与第一个示例相同。