@@ -78,37 +78,26 @@ public function normalize($object, $format = null, array $context = [])
78
78
}
79
79
80
80
$ metadata = isset ($ context ['resource_class ' ]) && null !== $ this ->resourceMetadataFactory ? $ this ->resourceMetadataFactory ->create ($ context ['resource_class ' ]) : null ;
81
- $ isPaginatedWithCursor = $ paginated && null !== $ metadata && null !== $ cursorPaginationAttribute = $ metadata ->getCollectionOperationAttribute (' pagination_via_cursor ' );
81
+ $ isPaginatedWithCursor = $ paginated && null !== $ metadata && null !== $ cursorPaginationAttribute = $ metadata ->getCollectionOperationAttribute ($ context [ ' collection_operation_name ' ], ' pagination_via_cursor ', null , true );
82
82
83
83
$ data ['hydra:view ' ] = [
84
84
'@id ' => IriHelper::createIri ($ parsed ['parts ' ], $ parsed ['parameters ' ], $ this ->pageParameterName , $ paginated && !$ isPaginatedWithCursor ? $ currentPage : null ),
85
85
'@type ' => 'hydra:PartialCollectionView ' ,
86
86
];
87
87
88
88
if ($ isPaginatedWithCursor ) {
89
- $ forwardRangeOperator = 'desc ' === strtolower ($ cursorPaginationAttribute ['direction ' ]) ? 'lt ' : 'gt ' ;
90
- $ backwardRangeOperator = 'gt ' === $ forwardRangeOperator ? 'lt ' : 'gt ' ;
91
-
92
89
$ objects = iterator_to_array ($ object );
93
90
$ firstObject = current ($ objects );
94
91
$ lastObject = end ($ objects );
95
92
96
93
$ data ['hydra:view ' ]['@id ' ] = IriHelper::createIri ($ parsed ['parts ' ], $ parsed ['parameters ' ]);
97
94
98
95
if (false !== $ lastObject ) {
99
- $ data ['hydra:view ' ]['hydra:next ' ] = IriHelper::createIri ($ parsed ['parts ' ], array_merge ($ parsed ['parameters ' ], [
100
- $ cursorPaginationAttribute ['field ' ] => [
101
- $ forwardRangeOperator => (string ) $ this ->propertyAccessor ->getValue ($ lastObject , $ cursorPaginationAttribute ['field ' ]),
102
- ],
103
- ]));
96
+ $ data ['hydra:view ' ]['hydra:next ' ] = IriHelper::createIri ($ parsed ['parts ' ], array_merge ($ parsed ['parameters ' ], $ this ->cursorPaginationFields ($ cursorPaginationAttribute , 1 , $ lastObject )));
104
97
}
105
98
106
99
if (false !== $ firstObject ) {
107
- $ data ['hydra:view ' ]['hydra:previous ' ] = IriHelper::createIri ($ parsed ['parts ' ], array_merge ($ parsed ['parameters ' ], [
108
- $ cursorPaginationAttribute ['field ' ] => [
109
- $ backwardRangeOperator => (string ) $ this ->propertyAccessor ->getValue ($ firstObject , $ cursorPaginationAttribute ['field ' ]),
110
- ],
111
- ]));
100
+ $ data ['hydra:view ' ]['hydra:previous ' ] = IriHelper::createIri ($ parsed ['parts ' ], array_merge ($ parsed ['parameters ' ], $ this ->cursorPaginationFields ($ cursorPaginationAttribute , -1 , $ firstObject )));
112
101
}
113
102
} elseif ($ paginated ) {
114
103
if (null !== $ lastPage ) {
@@ -153,4 +142,22 @@ public function setNormalizer(NormalizerInterface $normalizer)
153
142
$ this ->collectionNormalizer ->setNormalizer ($ normalizer );
154
143
}
155
144
}
145
+
146
+ private function cursorPaginationFields (array $ fields , int $ direction , $ object )
147
+ {
148
+ $ paginationFilters = [];
149
+
150
+ foreach ($ fields as $ field ) {
151
+ $ forwardRangeOperator = 'desc ' === strtolower ($ field ['direction ' ]) ? 'lt ' : 'gt ' ;
152
+ $ backwardRangeOperator = 'gt ' === $ forwardRangeOperator ? 'lt ' : 'gt ' ;
153
+
154
+ $ operator = $ direction > 0 ? $ forwardRangeOperator : $ backwardRangeOperator ;
155
+
156
+ $ paginationFilters [$ field ['field ' ]] = [
157
+ $ operator => (string ) $ this ->propertyAccessor ->getValue ($ object , $ field ['field ' ]),
158
+ ];
159
+ }
160
+
161
+ return $ paginationFilters ;
162
+ }
156
163
}
0 commit comments