我需要转换数据,如下所示:
{
"action": "PushEvent",
"commits_count": 5,
"repository": {"name":"example-repo"}
}
到一个字符串,如下所示:用户将5个提交推送到example-repo
问题是,我需要支持非常多的操作类型。什么是这个问题的最佳解决方案,我应该在哪里放置代码(Laravel)?
答案 0 :(得分:1)
我认为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']));
答案 1 :(得分:1)
我认为你最好把它放到Activity
模型中(如果你想让模型保持干净,那就是一个特性)。对于方法本身,除了单独实现每个操作之外,您没有太多其他选项。也许你可以在使用switch-case
时组合多个动作,但最难的部分可能是将动作翻译成动词。
或者,您也可以将其放入刀片组件中。如果您计划让通知看起来不错,这将是有意义的,例如如果你看下面的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>
如果您将活动编译成纯文本句子,您会注意到之后不能再创建相同的内容。
答案 2 :(得分:0)
你可以试试这样的事情
<?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();