Attualmente sto imparando come implementare un'API relativamente semplice utilizzando Symfony 3 (con FOSRestBundle) e JMS Serializer. Recentemente ho cercato di implementare la capacità di specificare, come client che consuma, quali campi devono essere restituiti all'interno di una risposta (entrambi i campi all'interno dell'entità e delle relazioni richieste). Per esempio;Consigli per l'implementazione di whitelist di campo con Symfony/FosRestBundle/JMS Serializer
/posts
senza comprendono stringa di query restituirebbe tuttiPost
proprietà di entità (ad esempio titolo, corpo, posted_at ecc) ma non relazioni./posts?fields[]=id&fields[]=title
sarebbe restituire solo l'id e il titolo per i post (ma ancora una volta, nessuna relazione)/posts?include[]=comment
dovrebbe includere quanto sopra, ma con il rapportoComment
(e tutte le sue proprietà)/posts?include[]=comment&include[]=comment.author
sarebbe tornato come sopra , ma includere anche l'autore in ogni commento
È una cosa sensata da provare e implementare? Recentemente ho fatto molte ricerche su questo aspetto e non riesco a vedere che posso 1) limitare il recupero dei singoli campi e 2) restituire le entità correlate solo se sono state esplicitamente richieste.
Ho avuto alcuni giochi iniziali con questo concetto, tuttavia, anche assicurando che il mio repository restituisca solo l'entità Post (cioè nessun commento), JMS Serializer sembra attivare il caricamento lento di tutte le entità correlate e non riesco a sembrare per fermare questo. Ho visto un paio di link, come this example però le correzioni non sembrano funzionare (per esempio in quel link, il commentate $object->__load()
chiamata non viene mai raggiunto in ogni caso nel codice originale.
ho implementato un relationship-based example of this using JMSSerializer's Group
functionality ma mi sembra strano doverlo fare, quando sarei idealmente in grado di creare un'istanza di Querybuilder di Doctrine, aggiungere dinamicamente le chiamate andWhere()
e fare in modo che il serializzatore restituisca solo i dati esatti senza caricare nelle relazioni
Mi scuso per aver vagato con questo ma Sono rimasto bloccato per un po 'di tempo e apprezzerei qualsiasi input! Grazie
Sì, questo ha senso! Questo significa che, assumendo che volevo applicare lo stesso principio ai singoli campi (non-relazioni come 'title' nel tuo esempio) avrei bisogno di gruppi per ogni campo? Immagino che questo sia l'unico modo per ottenere questo risultato, mi sembra un po 'strano che non sia possibile definire le relazioni quando si costruisce un'istanza di Doctrine QueryBuilder (aggiungendo condizionalmente join) e il serializzatore serializza semplicemente tali dati, senza. Grazie per la risposta però, accetterò questa risposta per ora :) –
Inoltre, mi dispiace di aggiungere ulteriori domande, ma sai come gestiresti i campi annidati? (cioè stai recuperando i post, ma vuoi includere/escludere di dire una relazione 'Utente' all'interno di una entità' Foo' sopra)? –
Vedere [l'annotazione '@ MaxDepth'] (http://jmsyst.com/libs/serializer/master/cookbook/exclusion_strategies#limiting-serialization-depth-of-some-properties) per limitare la profondità delle associazioni. Se hai bisogno di escludere/esporre totalmente alcuni campi, avrai sicuramente bisogno di trattare anche con i Gruppi. Se vuoi veramente usare un QueryBuilder personalizzato, non utilizzare affatto il serializzatore e idratare il risultato come array (cioè '$ qb-> getQuery-> getArrayResult()'), dovresti ottenere solo i campi aggiunti da una selezione dichiarazione. – chalasr