Controllo dell'input nel controllore o nel modello...

Ciao Gianni, mi chiedevo se fosse "sbagliato" controllare l'input (post) con Zend_Filter e affini nel controller e se non fosse meglio farlo nel modello.

Commenti a riguardo ?

 :bye:

inviato 8 anni fa
Andrea Turso
Andrea Turso
86
X 0 X

Giusto un'altra domandina spero non sia troppo Off Topic:

come accedo al post tramite l'oggetto request?

:bye:

risposto 8 anni fa
Andrea Turso
Andrea Turso
86
X 0 X

Non esiste una risposta univoca alla tua domanda, dipende dalle proporzioni del progetto e dal "peso" dell'architettura che decidi di sopportare.

Supponiamo di utilizzare una architettura che prevede l'uso di un Controller per caso d'uso.

Se bisogna scegliere tra il Model ed il Controller, io preferisco il Controller, poiché generalmente è li che va messa la logica del caso d'uso. Il model dovrebbe solo interfacciare il modello ad oggetti col modello relazionale.

Però secondo questa logica il Controller, essendo la mente pensante del caso d'uso, rischia di sovraccaricarsi di codice. Per questa ragione è corretto pensare di associare al Controller altre classi si supporto, specializzate in qualche particolare attività, ad esempio i controlli del caso d'uso, la gestione dei dati di sessione del caso d'uso, la logica di business del caso d'uso, ecc.

In questo modo il Controller deve solo occuparsi della logica di navigazione tra le pagine del caso d'uso e delegare le altre operazioni alle classi di supporto associate.

In questo modo si ha una proliferazione di file ma si raggiunge anche una notevole pulizia del codice.

P.S.: $request->getParam("nome_parametro");

risposto 8 anni fa
Gianni Tomasicchio
X 0 X

Dunque ora c'è l'articleController che fa il controllo sui dati inviati dal form :

articles/new/ il form invia alla stessa pagina (articles/new/) e qui vengono fatti i controlli:

<?php
$entry = new Entry;
      $author = $this->_auth->getIdentity();
      $defaults = array(
         'title'      => null,
         'text'       => null,
         'category'    => null
      );
      if ($this->_getParam('submit')) {
         $filters = array(
            '*'    => new Zend_Filter_StringTrim(),
            'title'   => new Zend_Filter_Alpha(true),
            'text'    => new Zend_Filter_Alnum(true)
         );
         $validators = array(
            'title'    => array(
               new Zend_Validate_StringLength(6, 32),
               new Zend_Validate_NotEmpty()
            ),
            'text'       => array(
               new Zend_Validate_StringLength(6, 65535)
            ),
            'category'    => array(
               new Zend_Validate_Int()
            )
         );
         $input = new Zend_Filter_Input($filters, $validators, $_POST);

         $defaults = array(
            'title'    => $input->getEscaped('title'),
            'text'       => $input->getEscaped('text'),
            'category'    => $input->getEscaped('category')
         );
         if ($input->isValid()) {
            $entry->newEntry($this->_auth->getIdentity(), $input->getEscaped());
         } else {
            $messages = $input->getMessages();
            $this->view->assign('messages', $messages);
         }
      }
      $this->view->assign('defaults', (object) $defaults);
      $this->view->assign('categories', $entry->getAllCategories());
      echo $this->view->render('default/articles/new.html');

ora vorrei spostare la business logic da questo controller, che deve solo mostrarmi il form a :

dynamics/form/postArticle/

in modo che possa eseguire la logica per la validazione dei dati e fare :

* ritornare a articles/new/ e aggiornare la vista con i messaggi di errore

* ritornare alla home page o ad una pagina di conferma dell'avvenuto inserimento

qualche suggerimento su come fare?

Grazie mille Gianni

:bye:

risposto 8 anni fa
Andrea Turso
Andrea Turso
86
X 0 X

per la segnalazione degli errori potresti lanciare un'eccezione personalizzata contenente il messaggio di errore

risposto 8 anni fa
Gianni Tomasicchio
X 0 X

mmh no vorrei inserire i messaggi nel form...si può fare?

risposto 8 anni fa
Andrea Turso
Andrea Turso
86
X 0 X

vuoi dire nell'HTML? Bruttino...

risposto 8 anni fa
Gianni Tomasicchio
X 0 X

cioè messaggi del tipo

"Nessun titolo inserito"

"Descrizione troppo lunga"

"categoria non selezionata"

non ci stanno nell'html ???

:D

:bye:

risposto 8 anni fa
Andrea Turso
Andrea Turso
86
X 0 X

mmm...non ho capito dove vuoi mettere quei testi.... ???

risposto 8 anni fa
Gianni Tomasicchio
X 0 X

risolto

risposto 8 anni fa
Andrea Turso
Andrea Turso
86
X 0 X

Ho utilizzato l'actionhelper flashMessenger e redirector.

<?php
//Dynamics_submitController
      if ($input->isValid()) {
         $entry->newEntry($this->_auth->getIdentity(), $input->getEscaped());
         $this->_redirect('/');
      } else {
         $messages = $input->getMessages();
         $this->_flashMessenger->addMessage($messages);
         $this->_redirector->goto('new', 'articles', 'default');
      }
risposto 8 anni fa
Andrea Turso
Andrea Turso
86
X 0 X

Quindi i messaggi li hai messi in Zend_Filter_Input? E' abbastanza flessibile?

risposto 8 anni fa
Gianni Tomasicchio
X 0 X

per la precisione è stasera che ho intenzione di personalizzare i messaggi di Zend_Filter_Input, ma a quanto ne so, per esperienza personale con altri test, è davvero molto macchinoso impostare i messaggi personalizzati.

In quanto a flessibilità Zend_Filter non mi sembra il massimo, dovrebbero ideare un sistema migliore.

Parlo anche dei validatori, insomma dei moduli che mette a disposizione il framework per processare l'input.

:bye:

risposto 8 anni fa
Andrea Turso
Andrea Turso
86
modificato 8 anni fa
X 0 X

Si, anch'io penso sia troppo macchinoso, infatti normalmente procedo con dei controlli classici e uso le eccezioni per far scattare l'allarme.

 :bye:

risposto 8 anni fa
Gianni Tomasicchio
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda