Un controller per pagina o più pagine in un controller?


16

Volevo solo qualche consiglio riguardo al modo di fare le cose MVC. Sto usando codeigniter e mi chiedevo se è meglio avere un controller per pagina per un sito Web o avere un controller per tutte le pagine?

Diciamo che ho un semplice sito Web in cui è possibile visitare la homepage, accedere, creare un account e contattare l'amministratore.

  1. Sarebbe meglio avere questi controller: frontend (indice), login, account, contatto OPPURE avere un controller chiamato frontend o qualunque altra cosa con le azioni come login, createAccount, contact?

  2. Quando sai se è meglio usare un controller in una situazione?


Ho sempre vissuto secondo il credo: un controllore per dominarli tutti e nell'oscurità li leghi. (Non proprio, ma mi piace il suo suono. :-)
Peter Rowell,

Risposte:


17

È meglio avere controller per unità logica, ad esempio AccountController (login, registrazione), PagesController (home, contatto), Backend -> PagesController (creare, modificare, eliminare), UsersController (creare, modificare, eliminare) e così via.


Come rappresenteresti un sito Web con queste aree: home, login, account, contatto. Utilizzeresti 2 controller come il tuo esempio? se vai su localhost / apri il homecontroller allora se vai su localhost / contact in teoria non dovrebbe andare al controller di contatto? e cosa intendi per backend?
Rushino,

Dipende dalla struttura delle pagine e da quante pagine hai. Realizzerò HomeController (home, contact) o PagesController (home, contact OR details (id)). Ad esempio in ASP.NET MVC hai HomeController predefinito con la pagina Home e Informazioni.
Babbo Natale,

Mi piace questo metodo Anche un ClientController (o come lo si desidera chiamare) per le azioni chiamate tramite Jquery.Ajax che non sono specifiche di una parte particolare dell'applicazione. cioè riutilizzabile da qualsiasi punto di vista
Chris

Mi sembra la risposta giusta. CodeIgniter accetta sottodirectory per i controller che consentono di separare i controller in zone in modo che io possa finire con due controller di pagina (uno per zona). Grazie!
Rushino,

Ma non finiresti con controller piuttosto grandi, anche se le sue azioni sono tutte relative? O non ha problemi?
Kid Diamond,

4

@Rushino Hai due 'app' qui: il front-end (per i lettori) e il back-end (per gli amministratori). Per ogni gruppo di funzionalità, hai un controller.

L'accesso è un gruppo di questo tipo, che include la generazione del modulo HTML (i campi, chiamando la vista) e la gestione del modulo (la convalida, la connessione con il modello). Quindi 'login' è un controller con due azioni: generateForm e handleForm.

Le pagine sono divise tra l'app front-end - che mostra solo le pagine - e l'app back-end che consente di modificarle, eliminarle, crearle e possibilmente visualizzarle in modo diverso. La homepage è almeno 'solo un'altra pagina' sul front-end, quindi rientra nel controller delle pagine. Sul backend, la sua logica potrebbe essere abbastanza diversa da giustificare un controller completamente diverso.

Per gli utenti: se gli utenti possono registrarsi, avranno bisogno di un controller front-end, ma in caso contrario, tutto ciò che ha a che fare con gli utenti va solo nel back-end.

Si noti che ciascuna delle funzioni di back-end potrebbe richiedere sia un generatore che un gestore. Queste cose possono essere suddivise in file di configurazione, tuttavia, con un plugin che è un generatore di moduli generico.

In sintesi, si presenta così:

Frontend
  Pages
    View, Handle
  Login
    View, Handle
  Users
    Register (note that the handler can be the same as 'create' on the backend)
  Contact
    View
    Handle

Backend
  Users
    Create, Delete, Edit, Update, View
  Pages
    Create, Delete, Edit, Update, View

Aspetta ... stai dicendo che una sezione rappresenta un'app? modo interessante di farlo (e probabilmente IL modo di farlo). Mi chiedo se il codeigniter lo faccia in questo modo ... controllerà. Devo essere sicuro che puoi passare da un'app all'altra senza interrompere alcuna sessione o stato di connessione.
Rushino,

1
@Rushino CodeIgniter può farlo in questo modo: puoi inserire le cartelle nella directory dei controller. La distinzione tra "app" non è a livello di database / modello, ma a livello di controller / vista. Il motivo della separazione è che il tuo backend sta facendo cose molto diverse, spesso con un design completamente diverso. Aiuta con sicurezza, perché è possibile limitare l'IP dell'intera directory di backend. E aiuta con lo sviluppo perché puoi lavorare sul backend senza influire sul frontend.
Dan soffia il

2

Penso che dovresti usare un Controller per unità di business, come OrdersController per tutte le operazioni relative agli ordini e simili. Sono consapevole che in questo caso i controller ottengono ENORME, ma possiamo ancora usare le classi di supporto per delegare cose come l'inizializzazione del modello e le classi parziali per diffondere azioni in file separati.

Ad esempio, posso avere OrdersControllerCreate.cs and OrdersController file OrdersController per la classe OrdersController ciascuno con il set di azioni corrispondente. Rende le cose molto più pulite e mantiene le operazioni degli ordini centralizzate in una singola classe di controller.

Solo i miei 2 centesimi.


0

Penso che potresti adottare un approccio diverso:

Un controller principale come porta d'ingresso che fornisce la richiesta a controller specifici. In questo modo è possibile utilizzare questo front controller per verificare cose comuni come l'autenticazione utente, google analitics e qualsiasi altra cosa generale che si desidera fare e mantenere pura la struttura MVC.

Questa non è una mia idea, ma Symfony Framework funziona in questo modo, quindi posso dirti che per mia esperienza questo è un modo davvero carino ed elegante per implementare un frontend.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.