Un metodo che elabora sia le richieste GET che POST viola l'SRP?

2

Sto iniziando con Zend Framework 3 e ho visto un esempio sul tutorial che si presenta così:

public function addAction()
{
    $form = new AlbumForm();
    $form->get('submit')->setValue('Add');

    $request = $this->getRequest();

    if (! $request->isPost()) {       // <-------------- HERE!!!!
        return ['form' => $form];
    }

    $album = new Album();
    $form->setInputFilter($album->getInputFilter());
    $form->setData($request->getPost());

    if (! $form->isValid()) {
        return ['form' => $form];
    }

    $album->exchangeArray($form->getData());
    $this->table->saveAlbum($album);
    return $this->redirect()->toRoute('album');
}

Ora, considerando quello che Robert C. Martin dice su SRP (da wikipedia ):

A class or module should have one, and only one, reason to change.

Dal mio punto di vista, date le specifiche per le modifiche al modulo di creazione (forse ora dobbiamo caricare i dati in una casella a discesa), ciò influenzerebbe la richiesta GET. Tuttavia, date le specifiche per le modifiche al reindirizzamento (ora reindirizziamo a /index invece che a /details ) ciò influirebbe sulla richiesta POST.

Poiché entrambi sono nello stesso metodo, questo viola l'SRP o mi manca qualcosa?

Disclaimer: vengo da Laravel, dove abbiamo 1 metodo per ogni richiesta; quindi avere un controllo come if($request->isPost) {} è sbagliato. Ma questa è la documentazione ufficiale di Zend Framework 3, quindi forse mi manca qualcosa.

    
posta Christopher Francisco 21.09.2016 - 23:11
fonte

1 risposta

1

Potrei essere frainteso, ma sembra che ci siano due domande qui: una sulla progettazione dell'endpoint HTTP e un'altra sulla progettazione della funzione.

Endpoints

Non ho familiarità con PHP, né con Zend Framework. Ma nel progettare un'API REST (ish), è abbastanza comune avere un endpoint api.mysite/users che rappresenti una collezione (in questo caso di utenti). Un GET a detto endpoint restituirebbe una raccolta di tutti gli utenti e un POST all'endpoint creerebbe un nuovo utente.

Non riesco a leggere il tuo codice, quindi non posso dire se questo è il tuo caso. Ma in generale, dovrebbero essere correlati diversi verbi su un singolo endpoint.

Funzioni

I come from Laravel, where we have 1 method for each request; so having a check like if($request->isPost) {} feels wrong.

Hai ragione. In effetti, una funzione con valore booleano isPost è errata. L'approccio corretto sarebbe avere un metodo getRequestMethod che restituisce un'enumerazione - o in lingue che non hanno tale supporto, una stringa ( shudders ). La dichiarazione del caso rimanderebbe al metodo appropriato. Naturalmente, questa logica potrebbe essere presa in considerazione dietro le quinte, e quindi si riempirebbe solo l'appropriato get , post , le funzioni etc (io uso un framework che adotta questo approccio).

    
risposta data 22.09.2016 - 01:35
fonte

Leggi altre domande sui tag