Elaborazione file CSV in MVC

1

Sto usando un framework MVC e ho sviluppato un modulo in cui il file .csv viene importato nel database, non sono sicuro di certe cose che cercherò di spiegare di seguito:

Passaggio 1:

Il file .csv viene caricato e faccio tutti i controlli iniziali come il file .csv valido, la dimensione ecc.

Passaggio 2:

Successivamente passo attraverso le intestazioni principali del file .csv e controllo se ci sono nuovi campi aggiunti al file e se ci sono poi creo una matrice di quei campi. Prima di controllare ho già ottenuto l'elenco dei campi esistenti dal db come array. Quindi creo una stringa di tutti i nomi dei campi della tabella, dopo averli correttamente disinfettati e salvati usando php

Passaggio 3:

Eseguo il file .csv riga per riga, disinfezione & valori di escape usando php e creare una stringa che viene utilizzata come VALUES per la mia query di inserimento

Passaggio 4:

Passo la stringa di campi e valori al modello per l'esecuzione della query.

La cosa ora è che sto eseguendo i passaggi da 1 a 3 nel controller e il passo 4 nel modello, quindi la domanda è: devo disinfettare & i campi di escape n valori nel controller o dovrei farlo nel modello? Che è tecnicamente e amp; logicamente un modo molto migliore di fare cose nel framework MVC.

    
posta Just_Do_It 18.11.2016 - 19:32
fonte

2 risposte

2

Ciò che inserisci in un controller e ciò che trova la sua strada nel modello dipende dalla lingua e dal framework che usi. Alcuni preferiscono i piccoli modelli che consistono in strutture dati e praticamente nessuna logica; altri preferiscono usare un controller come una colla e spostare la maggior logica possibile sui modelli. Data la revisione del codice che hai ottenuto, sembra che l'abitudine nella tua azienda / ecosistema sia quella di mettere la convalida dei dati nel modello.

Questo, a proposito, ha perfettamente senso. Immagina un modello Price che contiene il prezzo di un prodotto. Sarebbe meglio mettere la logica di validazione come "l'importo del prezzo non potrebbe essere inferiore o uguale a zero" nella classe Price effettiva, o farlo in un controller? In OOP, di solito inserisci questa logica nella classe Price .

Discutendo specificatamente la validazione, ad esempio ASP.NET MVC dove solitamente la maggior parte del codice può essere trovata nel controller, usa un meccanismo speciale dove la validazione dell'input (e più specificamente la validazione delle forme) viene eseguita attraverso gli attributi che decorano il membri del modello. Il controller non è coinvolto.

but I don't understand why would it cause any error

Non lo farà. I problemi con il tuo approccio sono solo quelli:

  • Rende difficile seguire la logica: i dati appartengono a una determinata classe, ma la convalida di questi dati è fatta in una classe diversa, che non ha nemmeno questa responsabilità in primo luogo.

  • Il modello può essere utilizzato da più controller, portando alla duplicazione della logica di convalida.

Probabilmente entrambi i casi non si applicano bene o affatto nel tuo caso attuale; tuttavia, si applicano per la parte restante del codice di base e mantenere il codice coerente è importante.

    
risposta data 18.11.2016 - 20:11
fonte
0

Preferisco i controller e i modelli (al giorno d'oggi principalmente Entità erroneamente denominate modelli) per essere "snelli". Garbage Collection e altro senza senso altrove, ma non lì.

Quindi devi lasciare che il controller deleghi il lavoro:

(Controller object whispering) "I could do it, but that's too much trouble. I'll let my minion do that hard work and I'll just sit back, relax and wait for him to finish. When he's finished, I have another minion waiting to do finish the hard work!"

Quindi consiglio di introdurre un 'Helper' che verrebbe chiamato dal controller.

Ciò che sostanzialmente farebbe è:

  • crea l'output di base e lo disinfetta nel processo
  • restituisce il risultato

Il risultato è una raccolta di valori che possono essere analizzati dal tuo modello (questa è una caratteristica importante dell'helper!).

Credo che ora avresti due passaggi:

  • Il controller invia e riceve dati da e verso l'helper
  • Il controllore invia i dati al modello e lo memorizza

Lo rende molto più pulito e il tuo codice è più leggibile!

Quando si ha a che fare con enormi quantità di dati, questo approccio potrebbe non funzionare sempre. Potrebbe essere necessario integrare il passaggio 2 nel passaggio 1 (l'operatore ausiliario agisce senza l'intervento del controller e memorizza i dati autonomamente).

    
risposta data 24.11.2016 - 13:04
fonte

Leggi altre domande sui tag