Ho un'applicazione a pagina singola in cui tutto nell'IU è guidato da javascript, quindi qualsiasi operazione che richiede dati o aggiornamento di dati viene eseguita tramite richieste Ajax. Il modo in cui le cose sono configurate in questo momento è che il mio Ajax chiamato è fatto su un file ajax.php che si occupa di instradarle al metodo di servizio appropriato. Funziona bene ma c'è un problema. Ogni volta che ho operazioni che richiedono un ID utente, non voglio passarle come parte di una richiesta Ajax in modo da evitare manomissioni. Dal momento che ho una sessione in esecuzione sul lato server, dispongo di un servizio di sicurezza da cui posso recuperare l'ID utente dell'utente attualmente connesso. La sicurezza lo fa utilizzando un oggetto Sessione che astrae l'accesso alla sessione (nel mio caso , $ _SESSION in PHP) implementando un'interfaccia. Il mio servizio di sicurezza viene iniettato in altri servizi, se necessario, quindi ad esempio, se ho un metodo PostService- > findUserPosts (), quel metodo usa il metodo getUserId () dell'oggetto SecurityService inserito per capire l'ID utente invece di avere è passato come argomento.
Il problema è che sospetto (e altri sembrano essere d'accordo) che non passare l'ID utente al servizio è una cattiva progettazione. Ma come faccio a farlo senza mandare l'ID utente via ajax? Posso pensare ad alcune opzioni, nessuna delle quali mi piace o conosco un buon modo per implementare:
1) Aggiungere un livello controller sul lato server, nel qual caso posso chiamare SecurityService- > getUserId () nel controller e inoltrare una chiamata separata a PostService- > findUserPosts ($ userId); il problema con questo approccio è che mi richiede di aggiungere un gruppo di controller che sono per la maggior parte abbastanza ridondanti. Così com'è, ho già un metodo PostService- > findPosts () che fondamentalmente chiama solo PostGateway- > findPosts (). Posso vivere con quella ridondanza perché ci saranno molti posti in cui il servizio dovrà fare di più. Ma aggiungere un terzo livello con un controller con un metodo findPosts (), sembra troppo doloroso.
2) Passa l'ID utente nella richiesta Ajax e crea una sorta di meccanismo di manomissione per assicurarti che la richiesta di ajax non possa essere modificata. Potrei farlo tagliando la stringa URL della mia richiesta e aggiungendola come parametro, e poi sul server confrontando l'hash. Questa è più offuscamento di qualsiasi altra cosa, dato che l'hash dovrebbe essere generato lato client, il che significa che qualcuno che guarda attraverso il codice potrebbe capire come viene generato l'hash.
3) Mantenere le cose come sono, tenendo presente che il mio ID utente è almeno non codificato e possono essere utilizzate varie implementazioni dell'oggetto Session, in questo modo l'ID utente può essere recuperato in diversi modi, senza vincolarmi all'oggetto $ _SESSION PHP.
4) Utilizzare un metodo ibrido di # 1 e la configurazione corrente in cui, se ho bisogno di accedere alle informazioni sulla sessione, utilizzo un controller, altrimenti chiamo direttamente il servizio. Questo potrebbe funzionare, anche se non sembra un approccio pulito e unificato.
Ho cercato di capirlo con due domande separate che trattano problemi separati più piccoli, ma penso che la mancanza di contesto rendesse difficile rispondere, quindi ho pensato di formulare una domanda con l'intero problema. I suggerimenti sono ben accetti I suggerimenti sono ben accetti O dovrei dire, tanto bisogno!
UPDATE: forse un compromesso valido sarebbe avere un metodo PostService- > findByUser ($ userId) e poi avere un metodo UserService- > findPosts () che ottiene l'ID utente da SecurityService PostService è lo stesso che fa ora?