将数据转换为字符串

Converting data to string

我需要转换数据,像这样:

{
    "action": "PushEvent",
    "commits_count": 5,
    "repository": {"name":"example-repo"}
}

到一个字符串,像这样:用户推送 5 次提交到 example-repo

问题是,我要支持的动作类型非常多。这个问题的最佳解决方案是什么?我应该把代码放在哪里 (Laravel)?

我认为 json_decode 是要走的路,例如:

$source = '{
    "action": "PushEvent",
    "commits_count": 5,
    "repository": {"name":"example-repo"}
}';

$actions = ['PushEvent' => 'pushed'];

$result = json_decode($source, true);

var_dump(sprintf('User %s %d commits to %s', $actions[$result['action']], $result['commits_count'], $result['repository']['name']));

我认为你最好将它放入 Activity 模型(或者特征,如果你想保持模型干净)。对于方法本身,除了单独实施每个操作外,您没有太多其他选择。也许您可以在使用 switch-case 时组合多个动作,但最难的部分可能是将动作转换为动词。

或者,您也可以将其放入 blade 组件中。如果您计划让您的通知看起来不错,这将是有意义的,例如如果您查看以下 HTML

<span class="activity">
    <span class="activity-user">User</span> pushed
    <span class="activity-count">5</span> commits to
    <span class="activity-repository">
       <a href="/path/to/example-repo">example-repo</a>
    </span>.
</span>

您会注意到,如果将 activity 编译成纯文本句子,您不能事后创建相同的内容。

你可以试试这个

<?php

function convert_multi_array($glue, $arr) {
    foreach ($arr as $key => $value) {
        if (@is_array($value))
        {
            $arr[$key] = convert_multi_array ($glue, $arr[$key]);
        }
    }
    return implode($glue, $arr);
}

$json_data = <<<END_OF_JSON
{
    "action": "PushEvent",
    "commits_count": 5,
    "repository": {"name":"example-repo"}
}
END_OF_JSON;

$array_data = json_decode($json_data, true);

$string_data = convert_multi_array(',', $array_data);


echo "<pre>";
print_r($json_data);
print_r($array_data);
echo($string_data);
die();