Мне нужно конвертировать данные, как это:
{
"action": "PushEvent",
"commits_count": 5,
"repository": {"name":"example-repo"}
}
В строку, как это: пользователь нажал 5 коммитов в пример-репо
Проблема в том, что мне нужно поддерживать очень большое количество типов действий. Как лучше всего решить эту проблему и куда мне поместить код (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
, но самой сложной частью, вероятно, будет перевод действия в глагол.
Кроме того, вы также можете поместить его в компонент лезвия. Это имело бы смысл, если вы планируете, чтобы ваши уведомления выглядели красиво, например, если вы посмотрите на следующий 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>
вы заметите, что потом не сможете создать то же самое, если скомпилируете свою деятельность в текстовое предложение.
Вы можете попробовать что-то вроде этого
<?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();