2015-04-18 35 views
5

Ho appena iniziato a dare un'occhiata al pattern MVC. La mia domanda è:Struttura PHP MVC dove mettere le proprie classi

Dove inserirei i miei altri file di classe (Database, Utente, Logger, Mailer, ecc.)? Dovrei creare una nuova directory per loro, ad es. libs?

Devo istanziare le classi nello Controller all'interno della funzione model?

<?php 

class Controller { 
    protected function model($model) { 
     require_once('../app/models/'. $model .'.php'); 

     return new $model(); 
    } 

    protected function view($view, $data = []) { 
     require_once '../app/views/'. $view .'.php'; 
    } 
} 
+0

Sembra che tu abbia rinunciato a studiare MVC e invece hai deciso di imparare Laravel. Bene ... Qualunque cosa paghi il conto, suppongo, il caso se tu abbia mai voglia di iniziare di nuovo a studiare su MVC, potresti passare attraverso conferenze e altri materiali elencati qui: http://stackoverflow.com/a/16356866/727208 –

risposta

2

Dove inserirei i miei altri file di classe (database, utente, registratore di cassa, mailer, ecc.)? Dovrei creare una nuova directory per loro, ad es. libs?

Inserirli in file separati poiché tutti forniscono funzionalità diverse dovrebbe andare bene. Non vi è alcuna differenza nella denominazione della directory, purché corrisponda alle convenzioni di denominazione del progetto o generale (probabilmente, ancora meglio).

Devo istanziare le classi nel Controller all'interno della funzione modello?

No. Per quanto vedo io, il flusso potrebbe essere simile a:

  1. Il file index riceve la richiesta e avvia una nuova istanza bootstrap
  2. bootstrap imposta il gestore throwable e il router
  3. router quindi chiama il rispettivo metodo in base al metodo di richiesta e uri fornito dalla corrispondenza con un insieme di route
  4. L'abbinamento route inizializza tutti i componenti della triade MVC e il metodo callable. I componenti (livello Model, livello View e livello Controller) vengono passati al metodo chiamato dallo router. Nel mio caso, chiamo la classe FrontController, il metodo init.
  5. Fondamentalmente, lo init è il luogo in cui viene effettivamente creata la terna MVC. Il livello Model è responsabile della logica aziendale, della persistenza, ecc.È importante notare che Model non è un singolo file o classe (lo stesso per View e Controller). Sia il livello View che il livello Controller consultano il livello Model per eseguire le rispettive azioni. La missione di strato è quella di gestire l'output, ad esempio, decidere se l'output avrà Content-Type di application/json o text/plain o quale Template da rappresentare. Inoltre, Views non sono Templates, destinati alla visualizzazione dei dati. Nota qui, Views chiedere i dati necessari direttamente dal livello Model; non c'è interazione con il livello Controller. Infine, i livelli Controller entrano in azione quando è necessaria l'interazione , ad esempio, un utente invia un modulo, il relativo Controller filtra l'input e chiama il metodo dal livello Model.
+0

Downvoted perché: 1. sostenere il calcolo in un costruttore; 2. uso di classi statiche, 3 controller non gestisce la comunicazione (fa il viewmodel in MVVM); 4. il tuo suggerimento su come creare un controller in un god-object è davvero fastidioso –

+0

@ tereško aggiornato. – sitilge

+1

sì, è un netto miglioramento ... avere un upvote –

1

Come MVC ha tre parti principali, io consiglierei (e ho notato che quasi tutte le strutture presenti sul mercato lo fanno) per creare una directory di ciascuno dei tre componenti, e posto le classi nella directory appropriata .

Come per quanto riguarda gli altri componenti, Database è un programma di utilità e può essere posizionato ad esempio in una directory lib, User è un modello e può andare alla cartella model, e Logger/Mailer può anche andare alla cartella lib. Questi sono esempi e non qualcosa da seguire rigorosamente.

Per quanto riguarda la creazione di istanze, ciascuna Controller può definire l'elenco dei models e libraries dipende e hanno gestire il quadro MVC l'inizializzazione di quegli oggetti. Segui lo schema dependency injection in questo modo.