2013-07-27 27 views
9

Ho osservato Laravel per un po 'e ho deciso di riprenderlo. È la prima volta che utilizzo un framework MVC e ho difficoltà a capire lo scopo dei modelli.Laravel 4 Modelli, come usarli

Ho letto un sacco di guide newbie e questo è più o meno tutto ciò che è nel loro modello (laravel saggio),

class Model extends Eloquent { 

} 

E poi nel loro controllore che fanno qualcosa di simile,

Non sono esperto del pattern MVC (probabilmente il più grande principiante là fuori) ma ho pensato che l'intero punto (o almeno un piccolo punto) fosse quello di separare molte azioni. E che il modello doveva essere responsabile della gestione di tutto ciò che è DB-saggio. Quindi in un certo senso, questo mi sembra sbagliato o almeno non la migliore pratica.

Ma se si avvia la creazione di una serie di funzioni è possibile eseguire il problema di avere un modello per ogni tabella. Che di nuovo, non sembra giusto. Quindi devi rendere il modello, in un certo senso, ambiguo. Nel senso che può prendere qualsiasi azione contro qualsiasi tabella?

Mi sembra tutto molto confuso al momento.

risposta

14

Avrai bisogno di un modello per evey table, perché ci sono altre cose relative a modelli che non possono essere condivisi, come nomi di colonne e convalida, ma se pensi di star ripetendo, puoi creare un BaseModel e aggiungere tutti i metodi o anche i metodi di sovraccarico eloquente è:

class BaseModel extends Eloquent { 

    public function whatever() { 

    } 

    public function save(array $options = []) { 
     // do what you need to do 
     parent::save(); 
    } 

} 

quindi creare i modelli di usarlo:

class Order extends BaseModel { 

} 

Ma tu non bisogno di molto su un modello, se i vostri modelli e nomi tabelle segue laravel modello (in questo caso il nome della tabella sarebbe "ordine" s '), quindi hai solo bisogno di questa semplice dichiarazione per avere un modello funzionante per il tuo tavolo.

Edit:

controllori hanno lo scopo di trasferire i dati da un modello da una vista, ma non devono sapere troppo sui vostri dati, quasi tutto su di loro dovrebbe si trova nella vostra modelli ("modelli Fat, controllori magro "), quindi hanno bisogno di sapere quel tanto che basta per avere" controllo ".

class OrdersController extends BaseController { 

    public function process() 
    { 
     $order = Order::find(Input::get('orderId'))->process(); 

     return View::make('orders.showProcessedOrder')->with('order',$order); 
    } 

} 
+0

Ottima risposta! E per elaborare un po 'quello che inizialmente intendevo, se voglio prendere una riga con l'id di 1, potrei fare Model :: find (1); nel mio controller ma sarebbe meglio fare pratica (usando genericamente quel termine) per posizionare quel "find" in una funzione e restituire il risultato al controller invece di farlo effettivamente nel controller? In questo caso potrebbe non esserlo ma se pensi cose più grandi. – Andreas

+0

appena modificato con qualche risposta. –

+0

Ma in realtà hai ragione. Si sono dimenticati delle origini dati e degli adattatori. Ecco perché potresti pensare che cose come la convalida e le relazioni devono essere riscritte un milione di volte per ogni database. Non vero. Affatto. ... E questo magico nirvana è persino possibile con Laravel, ma devi collegare tutto questo a te stesso. Ne vale la pena? O ti iscriveresti alla disorganizzazione? Fino a te, ma penso che la tua domanda iniziale fosse buona. Che tu ti consideri un principiante o no, stai pensando a buone pratiche di design. – Tom

-1

I modelli sono un involucro attorno alle tabelle del database (che sono le cose del mondo reale di cui si sta facendo l'applicazione). Forniscono un'interfaccia basata su codice OO per la memorizzazione dei dati e la logica specifica dei dati in un modello. OOP è interamente basato su classi e oggetti e converte elementi come le richieste HTTP in arrivo e l'archiviazione dei dati in tale forma.

La tua domanda è buona. Quando impari come creare applicazioni Web, avere un'app web a tre livelli - un livello di presentazione, un livello di business logic e un livello di archiviazione dei dati con i dati archiviati in un database relazionale - funziona alla grande e non ha senso doggone aggiungere un ulteriore livello di materiale relativo al database nel codice.

E, come ha scritto Antonio, nella programmazione MVC, "modelli grassi, controller magri" è ciò a cui stai lavorando. Il controllore dovrebbe idealmente essere solo un paio di linee di codice che passano la richiesta in entrata al modello corretto dove può essere convalidato, aggiunto al database, ecc. (Ma è più facile inserirlo nel controller mentre sei il primo imparare/capire MVC.)