zend-blog-3-backend

Форк
0
/
Serializer.php 
149 строк · 3.6 Кб
1
<?php
2
/**
3
 * Created by PhpStorm.
4
 * User: morontt
5
 * Date: 28.03.15
6
 * Time: 19:46
7
 */
8

9
namespace App\API;
10

11
use App\Utils\Inflector;
12
use League\Fractal\Pagination\PaginatorInterface;
13
use League\Fractal\Resource\ResourceInterface;
14
use League\Fractal\Serializer\ArraySerializer;
15

16
class Serializer extends ArraySerializer
17
{
18
    private array $pluralizeCache = [];
19

20
    /**
21
     * Serialize an item.
22
     *
23
     * @param string|null $resourceKey
24
     * @param array $data
25
     *
26
     * @return array
27
     */
28
    public function item(?string $resourceKey, array $data): array
29
    {
30
        return [$resourceKey ?: 'data' => $data];
31
    }
32

33
    /**
34
     * Serialize a collection.
35
     *
36
     * @param string|null $resourceKey
37
     * @param array $data
38
     *
39
     * @return array
40
     */
41
    public function collection(?string $resourceKey, array $data): array
42
    {
43
        $key = $resourceKey ?: 'data';
44

45
        $resources = [];
46
        foreach ($data as $resource) {
47
            $resources[] = $this->item($key, $resource)[$key];
48
        }
49

50
        return [$key => $resources];
51
    }
52

53
    /**
54
     * Serialize the included data.
55
     *
56
     * @param ResourceInterface $resource
57
     * @param array $data
58
     *
59
     * @return array
60
     */
61
    public function includedData(ResourceInterface $resource, array $data): array
62
    {
63
        $serializedData = [];
64
        foreach ($data as $value) {
65
            foreach ($value as $includeValue) {
66
                $fk = array_key_first($includeValue);
67
                if ($this->isCollection($includeValue)) {
68
                    if (empty($serializedData[$fk])) {
69
                        $serializedData[$fk] = [];
70
                    }
71
                    $serializedData[$fk] = array_merge($serializedData[$fk], $includeValue[$fk]);
72
                } else {
73
                    $key = $this->pluralize($fk);
74
                    if (empty($serializedData[$key])) {
75
                        $serializedData[$key] = [];
76
                    }
77
                    $serializedData[$key][] = $includeValue[$fk];
78
                }
79
            }
80
        }
81

82
        return empty($serializedData) ? [] : $serializedData;
83
    }
84

85
    /**
86
     * Serialize the paginator.
87
     *
88
     * @param PaginatorInterface $paginator
89
     *
90
     * @return array[]
91
     */
92
    public function paginator(PaginatorInterface $paginator): array
93
    {
94
        $current = $paginator->getCurrentPage();
95
        $data = [];
96
        if ($current - 1 > 0) {
97
            $data['previous'] = $current - 1;
98
        }
99

100
        if ($current + 1 <= $paginator->getLastPage()) {
101
            $data['next'] = $current + 1;
102
        }
103

104
        return [
105
            'pagination' => [
106
                'last' => $paginator->getLastPage(),
107
                'current' => $current,
108
                'previous' => $data['previous'] ?? false,
109
                'next' => $data['next'] ?? false,
110
            ],
111
        ];
112
    }
113

114
    /**
115
     * Serialize the meta.
116
     *
117
     * @param array $meta
118
     *
119
     * @return array
120
     */
121
    public function meta(array $meta): array
122
    {
123
        return !empty($meta['pagination']) ? ['meta' => $meta['pagination']] : [];
124
    }
125

126
    public function sideloadIncludes(): bool
127
    {
128
        return true;
129
    }
130

131
    private function isCollection(array $data): bool
132
    {
133
        $fk = array_key_first($data);
134

135
        return !isset($data[$fk]['id']);
136
    }
137

138
    private function pluralize(string $word): string
139
    {
140
        if (!empty($this->pluralizeCache[$word])) {
141
            return $this->pluralizeCache[$word];
142
        }
143

144
        $res = Inflector::pluralize($word);
145
        $this->pluralizeCache[$word] = $res;
146

147
        return $res;
148
    }
149
}
150

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.