come strutturare i modelli MVC e i modelli ORM

5

Ho qualche problema nel trovare una buona struttura di cartelle nel mio progetto e mi piacerebbe sapere quali altri modi posso usare per strutturare i miei file.

Attualmente sto lavorando in una cartella stoccata MVC.

www/
  Controllers/
  Models/
  Views/

Niente di speciale finora. Ma sto anche usando un sistema ORM. Con esso posso facilmente ottenere un 'oggetto' dal mio database come:

ORM::load('table');

Ora questo tipo di codice dovrebbe risiedere in un modello giusto? Quindi mi piacerebbe avere qualcosa di simile:

<?php
class userModel
{
    public function getAllUsers ( )
    {
        return ORM::load('table');
    }

    public function getUserById ( $id )
    {
        return ORM::load('table', 'userid=?', array($id));
    }
}
?>

Sembra buono finora secondo me ... Ma c'è ancora una cosa. Posso anche specificare un 'modello' quando si utilizza il sistema ORM. Con questo modello posso fondamentalmente impostare regole di validazione. Mi piace così:

ORM::withModel('authModel');

Ciò consente all'ORM di sapere che prima di aggiungere una nuova riga (o l'aggiornamento di una esistente) al DB, dovrebbe prima controllare il seguente modello per le regole di convalida.

<?php
class authModel //Or maybe authValidation??
{
    // Method gets automatically triggered when an update is done with the ORM
    public function onUpdate ( $obj )
    {
        if ( $obj->username == '' )
            throw new \Exception('No username');
    }

    public function onInsert ( $obj )
    {
        // Validations here too.
    }
}
?>

Ora il problema è che ho 2 tipi di modelli. Uno in cui fondamentalmente utilizzo getter / setter per ottenere e archiviare dati nel database (dal mio controller al mio modello).

E ho un altro modello in cui sono impostate le regole di convalida ... Non voglio mescolare entrambi nella stessa cartella. Quindi devo venire con un'altra struttura per questo. Qualcosa come:

www/
  Controllers/
  Models/
    Repositories/
    Entities/
  Views/

È solo che il mio modello non è un vero "repository", dal momento che non memorizza alcun oggetto nella classe repo e non ha un metodo commit () o qualcosa del genere.

Inoltre non posso memorizzare il 2 ° modello (per le convalide) nella cartella Entità, perché non sono affatto Entità ...

Qualche idea su come dovrei strutturare questo .. ??

    
posta user1175327 16.04.2012 - 17:12
fonte

4 risposte

1

Non mi definisco uno sviluppatore di back-end, quindi prima di rispondere, ti incoraggio strongmente a dedicare un po 'di tempo a guardare come gli altri stanno facendo architettura MVC. Penso che CakePHP sia un ottimo punto di partenza (e il loro codice è molto ben documentato!).

Il modo in cui vorrei farlo è creare una cartella / Utilities che altre parti del tuo programma possano richiamare quando necessario. Cose che potresti spesso utilizzare in più controller, viste o modelli. È possibile inserire regole di convalida standard - notEmpty (), alphaNumeric (), email (), ecc. - in questo file (/Utilites/Validation.php).

Quindi potresti creare un /Models/Model.php con il modello di modello di base (salva, elimina, aggiorna, beforeSave, ecc.) che consentirebbe ai nuovi modelli di ereditarlo in modo da non dover copiare / incollare linee di codice ripetute ovunque. Quindi puoi creare il tuo userModel e, se necessario, avere una convalida personalizzata all'interno di quel file.

Ancora una volta, non uno sviluppatore back-end, ma ho familiarità con CakePHP e guardando come hanno deciso di gestire queste difficoltà potrebbe darti qualche idea!

    
risposta data 25.04.2012 - 06:26
fonte
1

Basta rinominare "Archivi" "Convalida" o "Regole" e tutto ha senso di nuovo.

    
risposta data 28.05.2012 - 10:45
fonte
0

Sono leggermente confuso alla prima domanda. Stanno davvero lavorando con il recupero e l'archiviazione dei dati, ma non impegnano i dati da nessuna parte? O stai dicendo che in realtà non memorizzano un oggetto all'interno della classe, quindi non dovresti chiamarli Repository? Se è perché non memorizzano effettivamente un oggetto, puoi rinominare la directory in DataAccess o qualcosa di simile.

Se i file all'interno della directory Entities stanno facendo solo la validazione, puoi rinominarlo in Validation o ValidationRules.

Spero che questo ti abbia aiutato un po ', ma in realtà finchè il nome della directory descrive accuratamente cosa faranno i file al suo interno.

    
risposta data 28.04.2012 - 09:40
fonte
0

Esistono diversi approcci per quanto riguarda la struttura e la decisione viene presa in base alla quantità di astrazione desiderata.

Se si desidera separare le classi del modello di validazione e di dati, è possibile inserire le classi di dati in Entity directory e classi di convalida in Validation directory, entrambe in Model directory.

Puoi mettere i metodi di ricerca nella directory Repository se stai usando una classe di repository separata. Oppure puoi combinarlo con la classe dati.

Strutture diverse e diversi sistemi ORM hanno diverse convenzioni. Potresti voler controllare la documentazione di framework e ORM per quanto riguarda le migliori pratiche.

    
risposta data 28.04.2012 - 09:55
fonte

Leggi altre domande sui tag