-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[VOTE] Explicit Paginator return type #35
Comments
+1 |
L'utiliter du PaginatorAdapter est de rendre transparent la pagination pour l'iteration non ? Du coup pour moi le soucis c'est pas tant le type retour que l'adapter qui devrait parcourir toute les pages. |
Non, son utilité est de paginer les résultats, donc d'appliquer une limite sur la requête de départ en fonction du backend (DBAL, Mongo, Elastic, etc). Il n'est pas franchement prévu de l'utiliser seul en fait, c'est simplement un adapter. C'est plutôt le rôle du PaginatedIterator.
Et donc avoir des millions de résultat à afficher pour certaines APIs. Je renvoie sur la doc histoire que l'on sache bien tous comment ça fonctionne : https://github.com/shoppingflux/paginator/blob/master/docs/index.md |
Je rebondi sur la remarque de David en me disant que pour que ça soit clair, il faudrait retourner un |
Ok compris, j'étais pas dans le bon contexte: on veut garder la pagination dans ce cas et non juste itérer. Et je confirme que |
Je me demande s'il ne faut pas plutôt voir la pagination comme un stratégie de l'implémentation plutôt que comme une contrainte donnée par l'interface. |
On a déjà tous les outils pour le faire en typant sur un paginateur, je ne suis pas certain qu'on ai a y gagner à tout prévoir côté repository et complexifier les implementations (car faudra donner un exemple de comment on pourrait faire) : <?php
# cli.php file
$iterator = new PaginatedIterator($access->fetchAllBy(123));
$iterator->setItemsPerPage(500);
// Iterates over all elements for user 123
foreach ($iterator as $item) { echo $item->id; } On le fait ici d'ailleurs dans l'API, même si ça devrait plutôt être initialisé dans le Stream : https://github.com/shoppingflux/api/pull/961/files#diff-690a1a7f5092fe35480aa35f2fed0c3fedd60d2eb3f0b5cf5bc4627c9548489bR34-R35 |
Ok, je comprends. Est-ce que dans ce cas, ça ne vaudrait pas le coup d'appeler explicitement ces méthodes 'paginate' plutôt que 'fetch' ? L'idée étant que 'fetch' est réservé pour ce qui retourne des iterable et 'paginate' pour ce qui renvoie un paginator. En tant qu'utilisateur, on sait directement quel type de résultat on va devoir manipuler. |
Y a pas d'intérêt dans la mesure ou un L'idée n'est pas de forcer des paginator partout, mais de les typer systématiquement quand ils sont utilisés, car c'est pas un détail d'implémentation de fournir un itérateur sur 10 résultats au lieu de la totalité de la table dans un fetchAll. |
Summary
We are used to use abstractions as return type in our method declaration. In most of the cases it is a good practice because we can change implementation without breaking the client.
Usually, presentation repository interfaces declare fetchAll like methods, which allow to retrieve a collection of models based on filters. This is a typical declaration we can find in API project :
The assumption and expectations for someone who call
$access->fetchAllBy(123)
is to get an iterable set for all elements that match the constrain, here$userId
.As the return type provides an iterable type, the only thing the client can do is to... iterates on:
Looking the code above, we all expect to loop accross an array or \Iterator which provides what we asked for: all data for $userId.
But this is not what we do : Our DBAL (or whatever) implementations usually provide a
ShoppingFeed\Paginator\PaginatorAdapterInterface
orShoppingFeed\Paginator\PaginatorInterface
, which limit the number of items to fetch.So, if we process the same client code with a paginator :
We only got the first 10 results of the set by default.
Valid Code
As we still want to break result in chunk in most of the cases (paginated API's), we need to change the interface signatures and make the contract clear between client and implementation.
Now the clients nows it will be limited results when iterating on, and may controls it if desired.
PaginatorAdapterInterfaces have to stay to implementation level and not be exposed to interfaces, as we have no guaranties about their default behavior when they are not wrapper into a Paginator instance.
Invalid Code
Do not type againts
iterable
,\Traversable
,\Iterator
or\IteratorAggregate
types when expecting a limited set.Example:
Exemples of code to fix
Documentation
The text was updated successfully, but these errors were encountered: