In MVC, di solito, il controller imposta qualsiasi richiesta da rinviare al client / vista, incluso il codice di stato HTTP, ad esempio:
class Controller {
public function get(Request req, Response resp) {
if (this.model.get(req.getId()) {
resp.setStatusCode(Response::HTTP_OK)
} else {
resp.setStatusCode(Response::HTTP_NOT_FOUND)
}
}
}
Ci sono alcuni problemi nel farlo in questo modo:
- tutti i metodi del controller vengono divisi con if / else per l'impostazione di un diverso codice di stato HTTP
- Ho riscontrato un problema in cui qualcuno ha un Model :: createOrGet (), che restituisce semplicemente Model. Il controller non sa se è stato creato o recuperato dal negozio.
- l'impostazione del codice del codice di stato HTTP viene duplicata tra i controller.
Sarebbe meglio far passare il codice di stato HTTP al controller, ad esempio:
class Controller {
public function get(Request req, Response resp) {
cart := this.model.getOrCreate(req.getCustomerId()
resp.setStatusCode(this.model.getStatusCode())
if (cart) {
return cart
}
}
public function create(Request req, Response resp) {
cart := this.model.getOrCreate(req.getCustomerId()
resp.setStatusCode(this.model.getStatusCode())
if (cart) {
return cart
}
}
public function put(Customer c, array data) {
// this can result different success/error status codes
this.model.processPutDataForCustomer(c, data)
resp.setStatusCode(this.model.getStatusCode())
}
}
Fondamentalmente this.model
imposta l'ultimo stato sul codice di stato HTTP appropriato che può essere uno dei codici di errore di successo, errore client o server e il controller può ottenere solo il codice di stato.
È buono o esiste un modo migliore per questo problema comune? Non è logico che l'applicazione web conosca il codice di stato HTTP più profondo del controller?
Mi piacerebbe molto vedere l'esempio di più codice di stato HTTP che può essere restituito dal controller, qualcosa come una richiesta PUT che può essere una di "Richiesta non valida", "Conflitto", "Non trovato", "Creato "e" Nessun contenuto ".