zend-blog-3-backend
149 строк · 3.6 Кб
1<?php
2/**
3* Created by PhpStorm.
4* User: morontt
5* Date: 28.03.15
6* Time: 19:46
7*/
8
9namespace App\API;10
11use App\Utils\Inflector;12use League\Fractal\Pagination\PaginatorInterface;13use League\Fractal\Resource\ResourceInterface;14use League\Fractal\Serializer\ArraySerializer;15
16class Serializer extends ArraySerializer17{
18private array $pluralizeCache = [];19
20/**21* Serialize an item.
22*
23* @param string|null $resourceKey
24* @param array $data
25*
26* @return array
27*/
28public function item(?string $resourceKey, array $data): array29{30return [$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*/
41public function collection(?string $resourceKey, array $data): array42{43$key = $resourceKey ?: 'data';44
45$resources = [];46foreach ($data as $resource) {47$resources[] = $this->item($key, $resource)[$key];48}49
50return [$key => $resources];51}52
53/**54* Serialize the included data.
55*
56* @param ResourceInterface $resource
57* @param array $data
58*
59* @return array
60*/
61public function includedData(ResourceInterface $resource, array $data): array62{63$serializedData = [];64foreach ($data as $value) {65foreach ($value as $includeValue) {66$fk = array_key_first($includeValue);67if ($this->isCollection($includeValue)) {68if (empty($serializedData[$fk])) {69$serializedData[$fk] = [];70}71$serializedData[$fk] = array_merge($serializedData[$fk], $includeValue[$fk]);72} else {73$key = $this->pluralize($fk);74if (empty($serializedData[$key])) {75$serializedData[$key] = [];76}77$serializedData[$key][] = $includeValue[$fk];78}79}80}81
82return empty($serializedData) ? [] : $serializedData;83}84
85/**86* Serialize the paginator.
87*
88* @param PaginatorInterface $paginator
89*
90* @return array[]
91*/
92public function paginator(PaginatorInterface $paginator): array93{94$current = $paginator->getCurrentPage();95$data = [];96if ($current - 1 > 0) {97$data['previous'] = $current - 1;98}99
100if ($current + 1 <= $paginator->getLastPage()) {101$data['next'] = $current + 1;102}103
104return [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*/
121public function meta(array $meta): array122{123return !empty($meta['pagination']) ? ['meta' => $meta['pagination']] : [];124}125
126public function sideloadIncludes(): bool127{128return true;129}130
131private function isCollection(array $data): bool132{133$fk = array_key_first($data);134
135return !isset($data[$fk]['id']);136}137
138private function pluralize(string $word): string139{140if (!empty($this->pluralizeCache[$word])) {141return $this->pluralizeCache[$word];142}143
144$res = Inflector::pluralize($word);145$this->pluralizeCache[$word] = $res;146
147return $res;148}149}
150