如何处理构建属性中的多维数据以使用foreach处理它们?

时间:2015-06-09 20:51:14

标签: arrays multidimensional-array phing

有一个用户列表,其中舞台和制作应该是不同的:

user1:
    name: username1
    password: password1
    email: email1
    roles: role1, role2
user2:
    name: username2
    password: password2
    email: email2
    roles: role1, role2
user3:
    name: username3
    password: password3
    email: email3
    roles: role1, role2
user4:
    name: username4
    password: password4
    email: email4
    roles: role1, role2
user5:
    name: username5
    password: password5
    email: email5
    roles: role1, role2

我试图把它们放在build.properties文件中(我跳过角色部分)

[user]
admins=username1|password1|email1,username2|password2|email2,username3|password3|email3,username4|password4|email4,username5|password5|email5

使用build.xml

中的以下代码段可以正常工作
<target name="createUsers">
    <foreach list="${admins}" param="_userset" target="createUser" />
</target>

<target name="createUser">
    <php expression="strpos('${_userset}', '|')" returnProperty="_pos1"/>
    <php expression="strrpos('${_userset}', '|')" returnProperty="_pos2"/>
    <php expression="${_pos2}-${_pos1}" returnProperty="_len"/>

    <php expression="substr('${_userset}', 0, ${_pos1})" returnProperty="_username"/>
    <php expression="substr('${_userset}', ${_pos1}+1, ${_len}-1)" returnProperty="_password"/>
    <php expression="substr('${_userset}', ${_pos2}+1)" returnProperty="_email"/>

    <SymfonyConsole console="${bin.symfony}" command="fos:user:create">
        <arg value="${_username}" />
        <arg value="${_email}" />
        <arg value="${_password}" />
    </SymfonyConsole>
</target>

但是build.properties文件中的部分是非常难以理解的,并且还添加了新的值,比如角色,这也是一个列表,是非常不方便的。

分解行不起作用,例如java https://www.sinch.com/docs/sms/#Authorization

[user]
admins=username1|password1|email1,\
    username2|password2|email2,\
    username3|password3|email3,\
    username4|password4|email4,\
    username5|password5|email5

有更好的方法来存储多维数据吗?

1 个答案:

答案 0 :(得分:0)

对此的一个解决方案是编写一个adhoctask,部分类似于http://raphaelstolt.blogspot.ie/2009/04/creating-and-using-phing-ad-hoc-tasks.html(一个非常简单的例子在https://www.phing.info/docs/guide/stable/app.coretasks.html#AdhocTaskdefTask的phing文档中)。

您将在该adhoctask中迭代您的数组(可能作为属性传入或直接从属性文件中读取... - 更好的是作为写入文件的序列化数组)。

从一项临时任务中调用一个phing任务并非严格可行,但你可以通过执行来解决这个问题......

$r = exec(escapeshellcommand("phing -f build.xml symfonycreateusertask");

但是,由于你只是简单地使用SymfonyConsole来控制输出到symfony,我会直接这样做。

作为一个非常粗略的例子,代码可能如下所示:

<adhoc-task name="createusers"><![CDATA[
        class CreateusersTask extends Task {
            private $filename;

            function setFile($filename) {
                $this->filename = $filename;
            }

            function main() {
                $this->log("Createusers: " . $this->filename);
                $serialised = file_get_contents($this->filename);
                $users = unserialize($serialised);
                foreach($users as $userRow) {
                    $output = [];
                    $return = 0;
                    $user = $userRow['user'];
                    //....
                    $r = exec(
                     "symfony fos:user:create $user $email $password", 
                     $output, 
                     $return
                    );
                    $this->log(implode($output));
                }
            }
        }
]]></adhoc-task>

目标......

<target name="...">
<createusers file="users.data"/>
</target>