2009-12-31 5 views
6

Qual è il modo migliore per organizzare i controller. Diciamo che ho un controller utente e un'azione di registro, dovrei anche avere un'azione process_registration dove convalido ed elabora i dati, o semplicemente eseguo tutta l'elaborazione all'interno dell'azione di registro stessa. Devo avere un'azione di validazione/elaborazione per ogni azione che lo richiede (registro, processo_registrazione, ecc.)Come organizzare i controller per ottenere la migliore struttura (MVC)

Ho anche notato che molte persone hanno moduli e controller esclusivamente per la convalida e l'elaborazione delle informazioni, (suppongo di mantenere tutte le logiche e le regole di validazione in un punto, forse?)

Credo che la mia domanda sia: quanto distanti devono essere separate le cose? Questa domanda vale anche per i modelli e le viste.

risposta

3

Generalmente la convalida dovrebbe avvenire nel modello; questo è il punto del paradigma MVC. La logica del controller consiste nel rimbalzare l'utente tra le azioni, le viste sono puramente per la presentazione e la logica aziendale si trova nei modelli.

Alcuni quadri (CodeIgniter) divergono selvaggiamente da l'intento di MVC facendo modelli oggetti piatti che non hanno alcuna logica (convalida o altro) in allegato, che richiede di spostare la logica di convalida nello strato di controllo, ma a quel punto il vostro " i modelli "non sono affatto modelli, ma matrici glorificate.

Per quanto riguarda due azioni "register" e "process_register", trovo molto più pulito avere un'azione, che risponde in modo diverso per pubblicare e ricevere richieste. Mi piacerebbe chiamare questa azione "creare" per mantenere le cose RESTful, e hanno un percorso definito dovunque il tuo quadro definisce è percorsi per mappare "/ register" a "/ utente/creare"

Esempio pseudo-php:

<?php 

class User_controller { 
    // [GET|POST] /users/create 
    function create() { 
    $user = new User(); 
    $error = ''; 

    if (postback) { 
     // form has been submitted. 
     $user->name = $_POST['name']; 
     $user->password = $_POST['pasword']; 

     if (validate_user($user)) { 
     $user->save(); 
     redirect("user/show/$user->id"); 
     } 
     // user save failed, fall through to displaying the new user form 
     // the user's name and password (and other fields) are now populated, 
     // and will display 
     $error = 'Account creation failed.'; 
    } 

    // Render the view with the user and the error message (if any) 
    render('views/users/create', $user, $error); 
    } 
} 

?> 
+0

Grazie mille, sarebbe bello se potessi spiegare ulteriormente come sarebbe il tuo modello in questo esempio .. grazie – BDuelz

1

La mia sensazione è che sia meglio mantenere la convalida e l'elaborazione nel modello. Utilizzare il controller solo per gestire l'associazione della richiesta a una funzione del modello.

This section da "Zend Framework: Surviving The Deep End" può essere una buona lettura.

0

Suppongo che il miglior consiglio che posso dare in base alla tua domanda è che vorrai suddividere le tue azioni all'interno di un controller nella misura in cui desideri modularizzare il tuo sito. Dovrai anche tenere presente che ci sono dei costi sia in fase di elaborazione che in termini di SEO se passi continuamente da un'azione all'altra, perché le azioni devono essere associate a URL univoci.

Ecco un caso di utilizzo in cui si desidera separare la registrazione dall'azione di registrazione: Si desidera essere in grado di registrare un utente tramite AJAX in vari punti del sito. Con una diversa azione per accedere alla pagina di registrazione ed elaborare i dati di registrazione, molto probabilmente sarai in grado di riutilizzare le azioni sia per una pagina di registrazione sia per un lightbox di registrazione o un cassetto di registrazione rapida su qualsiasi pagina.

Un caso in cui non si vorrebbe disturbare la suddivisione dell'elaborazione della registrazione e la pagina di registrazione è se si sta solo programmando di avere una pagina di registrazione statica. In questo modo, puoi controllare e vedere se stai ricevendo i dati del modulo e fare sia la visualizzazione e l'elaborazione dei moduli in un'unica azione.