【问题标题】:Creating an XML file to store permissions and parsing it with PHP to create a list创建一个 XML 文件来存储权限并用 PHP 解析它以创建一个列表
【发布时间】:2016-06-30 11:04:33
【问题描述】:

我正在尝试创建一个 xml 文件来存储某个角色和区域内的用户应该能够看到的项目列表,然后使用 PHP 对其进行解析以检索此列表。

因此,如果用户从某个 $area 登录,则将首先检查该区域,如果该区域不在 xml 中,则将其忽略。

用户一次只能在一个 $area 中,所以如果当前的 $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 >0 我真的不确定如何继续,我的想法是使用与角色列表匹配的 xpath 项构建一个对象:

foreach($roles as $role){
            $roleNodes += $matchingAreas->xpath('/permissions/area/role[@name="' . $role . '"]');
        }

我是 PHP 新手,这开始看起来很混乱/效率低下,所以我希望有人能告诉我进行此类操作的最佳方式?

谢谢

【问题讨论】:

    标签: php xml xpath


    【解决方案1】:

    您可以使用单个 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,输出将与第一个示例相同。

    【讨论】:

    • 谢谢,如果一个用户有多个角色,我需要一个额外的循环吗?
    • @mao 不,您可以在 XPath 中使用 contains 测试。查看更新。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-25
    • 1970-01-01
    • 2012-12-16
    • 1970-01-01
    • 1970-01-01
    • 2016-02-26
    相关资源
    最近更新 更多