È possibile chiamare qualsiasi classe di modello php in un MVC dal controller?

4

Sto creando un semplice MVC al momento e mi chiedo se sia "corretto" essere in grado di chiamare qualsiasi classe modello direttamente dal controller per ottenere i dati da inviare alla vista?

Ho la seguente struttura di cartelle:

.htaccess
index.php
/controller
/model
/templates

Ho anche le classi modello necessarie all'interno di /model folder , al momento ho provato a giocare con /model/model.class.php per cercare di costruire tutte le parti del sito ma sta già iniziando a diventare enorme e penso che potrebbe sia meglio sminuzzarlo completamente.

Penso che l'approccio migliore sia l'utilizzo:

elseif($_GET['type'] == "Profile") {
    $profile = new thread($userId);
    $comments =  $profile->getComments();
    require "templates/profile.php";
}

Quanto sopra è un breve esempio, ma è come un controller potrebbe / dovrebbe / potrebbe sembrare o era il primo approccio migliore o mi manca completamente il punto della comunicazione del modello e del controller?

    
posta Dan 07.01.2012 - 04:12
fonte

4 risposte

2

Non sono sicuro di comprendere completamente la tua domanda, quindi mi scuso se ho interpretato male la cosa.

Un controller può avere accesso a qualsiasi modello della tua applicazione. Non c'è motivo di assegnare un set di modelli a ogni controller e di limitare l'accesso solo a tali modelli.

Ora, un modello è collegato a una vista (se la vista richiede un modello). Se la vista HomePage prevede il modello RecentPosts , il controllore deve fornire il modello RecentPosts inizializzato alla vista.

Dipende dal controller decidere dove e quando chiamare una vista e passare ad esso un modello richiesto da questa vista.

    
risposta data 07.01.2012 - 04:24
fonte
0

Per consentire la separazione delle preoccupazioni, i tuoi controllori dovrebbero sicuramente poter accedere a più modelli. Ad esempio, su un sito di blog è necessario un modello per gestire i tuoi post e un altro per gestire gli utenti. Tuttavia, quando il controller che gestisce la funzionalità di recupero dei post per generare la visualizzazione di visualizzazione, è probabile che (a seconda di come sono stati memorizzati i dati) dovrà anche accedere al modello utente per ottenere nomi e altre informazioni a seconda di quale vista ha bisogno.

Per il resto della tua domanda, non sono sicuro di seguire completamente la tua riflessione senza vedere il tuo codice. Tuttavia, ti suggerisco di scaricare alcuni dei framework disponibili come CodeIgniter , CakePHP , FuelPHP , Zend , o altri come trovato qui . Prenditi del tempo e familiarizza con diverse implementazioni. Questo ti aiuterà nel vedere ciò che altri hanno provato e ciò che preferisci. Trovo spesso che aiuti a provare altri approcci ai problemi nel processo di sviluppo / miglioramento di ciò su cui sto lavorando.

    
risposta data 07.01.2012 - 16:17
fonte
0

Sì, puoi consentire a qualsiasi controller di chiamare qualsiasi modello. Questo è in realtà ciò che riguarda MVC.

Diversi quadri risolvono questo problema in modi diversi. Ad esempio, in Zend Framework, puoi creare un nuovo modello semplicemente creando un nuovo oggetto:

$my_model = new My_Model($someId);

Ora è un problema dei caricatori automatici trovare la posizione fisica del file in cui si trova questo modello e richiederlo. È anche possibile configurare il caricatore automatico, nel caso in cui si desideri una struttura di directory non standard.

In Magento, ad esempio, il caricamento del modello avviene tramite il metodo statico:

$my_model = Mage::getModel('my/model', $someId);

In generale questo fa esattamente la stessa cosa di prima.

A partire dalla struttura delle directory, assicurati di non ingrossare l'intera directory / model. Dividili in sottodirectory, come questo (per esempio My_Model):

/model
 - my/
    model.php
    something.php
 - post/
    post.php
    author.php
 - comment/
    comment.php
    foo.php

Puoi anche assegnare un nome ai tuoi modelli e renderli un po 'più simili ai pacchetti Javas, poiché questo è supportato in PHP 5.3 sopra (se ricordo male). autoloader di Zend Framework già fa questo da entrambi gli spazi dei nomi che simulano o actaully loro utilizzo (PHP 5.3 e Solo ZF 2.0). Per semplificarti la vita, puoi usare qualche tipo di caricatore automatico. Ti suggerirei di utilizzare quello di Zend Framework o puoi scriverne uno da solo.

    
risposta data 07.01.2012 - 18:36
fonte
0

Il problema con questa struttura di cartelle tradizionale è che devi inserire ad es. modelli e viste che appartengono insieme in diverse cartelle. Questo potrebbe creare un incubo. Personalmente trovo difficile e dispendioso in termini di tempo per esplorare enormi strutture di directory.

Invece, ho trovato utile seguire i consigli di Blog di Derick Bailey e mettere tutti i componenti che appartengono a un modulo nella cartella corrispondente. In tal modo si evitano anche enormi directory ma piuttosto più directory con nomi significativi.

Ora nella tua domanda la parola "qualsiasi" è confusa. Se intendi essere in grado di chiamare qualsiasi singola funzione, allora sicuramente no - solo quelle di cui hai veramente bisogno. Altrimenti - sì :) (vedi qualsiasi origine su MVC).

    
risposta data 30.08.2013 - 11:19
fonte

Leggi altre domande sui tag