Sconto del 20% su tutti i corsi inserendo nel form il codice SPRING20 | Fino al 30 aprile
Sconto del 20% su tutti i corsi inserendo nel form il codice SPRING20 | Fino al 30 aprile

Guide per aspiranti programmatori

Lezione 25 / 30

Model, Resource Controller e CRUD in Laravel

In alcuni contesti, come per esempio quello delle API RESTful, potrebbe essere utile unire insieme la “risorsa” presente sul database (intesa come riga di dati salvati) con la “risorsa” intesa come documento sul web accessibile tramite URI (che, per l’appunto, è l’acronimo di Uniform Resource Identifier).

In questo modo è possibile creare un legame 1:1 tra l’istanza di un model e la risorsa esposta esternamente tramite richieste HTTP. Le URI diventano, quindi, il punto di accesso al database, rendendo possibile effettuare operazioni CRUD (Create, Retrieve, Update, Delete) attraverso richieste HTTP. In pratica, si definisce una convenzione che associa la richiesta HTTP all’azione da compiere su una certa entità (cfr la tabella dei nomi di metodi suggeriti).

Se, poi, la nostra applicazione gestisce e salva sul database diversi model/risorse (per esempio Book, Movie e MusicAlbum), potrebbe essere pratico e lungimirante gestire l’accesso a queste risorse in un modo coerente.

Laravel offre una gestione dedicata per questo scenario tipico di sviluppo, offrendo delle rotte e dei controller definiti resource.

Creazione di un controller resource in Laravel

È possibile creare un controller resource in Laravel fornendo l’opzione –resource al comando Artisan make:controller.

php artisan make:controller BookController –resource

Il controller così creato conterrà già la firma di tutti i metodi convenzionali necessari per connettere il controller a una serie di rotte prestabilite.

Abbiamo già elencato alcuni di questi metodi nel capitolo dedicato ai controller.

namespace App\Http\Controllers;

class BookController extends Controller
{
  /**
  * Mostra l'elenco delle risorse Book presenti nel database
  */
  public function index()
  {
    //
  }

  /**
  * Mostra il form per creare una nuova risorsa Book
  */
  public function create()
  {
    //
  }

  /**
  * Salva una nuova risorsa Book nel databse
  */
  public function store(Request $request)
  {
    //
  }

  /**
  * Mostra la risorsa Book con l'id fornito
  */
  public function show($id)
  {
    //
  }

  /**
  * Mostra il form per modificare la risorsa Book con l'id fornito
  */
  public function edit($id)
  {
    //
  }

  /**
  * Aggiorna la risorsa Book con l'id fornito sul database coi dati inviati
  */
  public function update(Request $request, $id)
  {
    //
  }

  /**
  * Elimina la risorsa Book con l'id fornito sul database
  */
  public function destroy($id)
  {
    //
  }
}

I controller di tipo resource possono essere “attivati” registrando una rotta di tipo resource nel file routes/web.php o routes/api.php a seconda che si voglia realizzare un gruppo di rotte di tipo web o api.

use App\Http\Controllers\BookController;

Route::resource('/books', BookController::class);

In questo caso, Laravel realizzerà implicitamente tutte le associazioni necessarie per gestire le varie combinazioni di metodi e path con e senza parametri.

Metodo HTTP URI Metodo del controller
GET /books index
GET /books/create create
POST /books store
GET /books/{book} show
GET /books/{book}/edit edit
PUT/PATCH /books/{book} update
DELETE /books/{book} destroy

 

Collegamento a un model in Laravel

Il resource controller mostrato poco sopra non è, però, direttamente collegato ad un model. Il comando make di artisan, infatti, permette di creare la struttura del controller, generando i metodi previsti, ma non inserisce alcuna logica per recuperare le informazioni dal database.

Si è, quindi, liberi di realizzare nel modo più opportuno il codice necessario a recuperare o salvare da database.

Sicuramente, se per la risorsa sul database abbiamo già disponibile un model, risulterà più agevole utilizzare direttamente il model e lasciare che Laravel e Eloquent riuniscano insieme i vari pezzi.

Nel nostro caso, quindi, potremmo aggiornare i vari metodi del controller per avere qualcosa tipo

public function store(Request $request)
  {
    $arguments = $request->validate([/* regole di validazione qui */])

    Book::create($arguments)
  }

  public function show(Book $movie)
  {
    return Book::find($movie);
  }

Laravel provvederà a fornire, con vari automatismi già visti altrove, tutto ciò che serve per fare in modo che, alla richiesta GET /books/42 venga restituito il contenuto della riga con id 42 della tabella books.

È, ovviamente, possibile attivare e collegare ogni altra funzione messa a disposizione da Laravel ed Eloquent, come, per esempio, la paginazione per i risultati del metodo index oppure l’utilizzo di form request dedicate per le azioni di creazioni e modifica della risorsa.

Pagamento rateale

Valore della rata: A PARTIRE DA 115 €/mese.

Esempio di finanziamento 

Importo finanziato: € 2440 in 24 rate da € 115 – TAN fisso 9,55% TAEG 12,57% – importo totale del credito € 2841.

Il costo totale del credito comprende: interessi calcolati al TAN indicato, oneri fiscali (imposta di bollo sul contratto 16,00 euro*) addebitati sulla prima rata, costo mensile di gestione pratica € 3,90, spesa di istruttoria € 0,00, spesa per invio rendicontazione periodica cartacea € 0,98 (o spesa per invio rendicontazione periodica cartacea € 0,00), imposta di bollo su rendicontazione periodica € 0,00. Modalità di rimborso obbligatoria: addebito diretto su c/c. La scadenza delle rate è determinata dal giorno della liquidazione del contratto; la data di scadenza delle rate è prevista il giorno 15 del mese. L’importo di ciascuna rata comprende una quota di capitale crescente e interessi decrescente secondo un piano di ammortamento “alla francese”. Offerta valida dal 01/01/2024 al 31/12/2024.

Messaggio pubblicitario con finalità promozionale. Per le informazioni precontrattuali richiedere sul punto vendita il documento “Informazioni europee di base sul credito ai consumatori” (SECCI) e copia del testo contrattuale. Salvo approvazione di Sella Personal Credit S.p.A. Aulab S.r.l. opera quale intermediario del credito NON in esclusiva.

*In fase di richiesta del finanziamento verrà proposta la facoltà di selezionare, in alternativa all’imposta di bollo sul contratto di 16,00 euro, l’imposta sostitutiva, pari allo 0,25% dell’importo finanziato.

Pagamento rateale

Valore della rata: A PARTIRE DA 210 €/mese.

Esempio di finanziamento  

Importo finanziato: € 4500 in 24 rate da € 210,03 – TAN fisso 9,68% TAEG 11,97% – importo totale del credito € 5146,55.

Il costo totale del credito comprende: interessi calcolati al TAN indicato, oneri fiscali (imposta di bollo sul contratto 16,00 euro*) addebitati sulla prima rata, costo mensile di gestione pratica € 3,90, spesa di istruttoria € 0,00, spesa per invio rendicontazione periodica cartacea € 0,98 (o spesa per invio rendicontazione periodica cartacea € 0,00), imposta di bollo su rendicontazione periodica € 0,00. Modalità di rimborso obbligatoria: addebito diretto su c/c. La scadenza delle rate è determinata dal giorno della liquidazione del contratto; la data di scadenza delle rate è prevista il giorno 15 del mese. L’importo di ciascuna rata comprende una quota di capitale crescente e interessi decrescente secondo un piano di ammortamento “alla francese”. Offerta valida dal 01/01/2024 al 31/12/2024.

Messaggio pubblicitario con finalità promozionale. Per le informazioni precontrattuali richiedere sul punto vendita il documento “Informazioni europee di base sul credito ai consumatori” (SECCI) e copia del testo contrattuale. Salvo approvazione di Sella Personal Credit S.p.A. Aulab S.r.l. opera quale intermediario del credito NON in esclusiva.

* In fase di richiesta del finanziamento verrà proposta la facoltà di selezionare, in alternativa all’imposta di bollo sul contratto di 16,00 euro, l’imposta sostitutiva, pari allo 0,25% dell’importo finanziato.

Contattaci senza impegno per informazioni sul corso

Scopriamo insieme se i nostri corsi fanno per te. Compila il form e aspetta la chiamata di uno dei nostri consulenti.