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