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 13 / 30

Controller in Laravel

Laravel è pensato per rendere semplice e immediata la separazione dei compiti (separation of concerns) tra diverse classi. Per questo motivo è possibile separare la definizione di una rotta (intesa come definizione della URI e del metodo HTTP) dalla gestione del comportamento per generare la risposta. Le classi che si occupano della gestione sono definite controller.

Tali classi presentano diversi metodi pubblici e ciascuna di esse viene associata a una URI e a un metodo HTTP. In questo modo, è possibile raggruppare la logica di gestione di richieste correlate in una singola classe ed evitare che il file delle rotte route/web.php cresca a dismisura rendendo impossibile capire quali rotte effettivamente abbiamo dichiarato.

In una applicazione Laravel, i controller sono salvati nella directory app/Http/Controllers.

Creare un controller in Laravel

Il modo più pratico per creare una classe controller è tramite il comando Artisan make.

php artisan make:controller <NomeController>

È buona abitudine usare il suffisso Controller per il nome del controller e della rispettiva classe, per esempio UserController o PostController.

Rotte e controller in Laravel

Una volta creato un controller, dovremo collegare il controller a una rotta o a un gruppo di rotte. Il modo più semplice è quello di collegare la rotta al controller e al metodo che gestirà la rotta.

use App\Http\Controllers\PostController;

Route::get('/posts', [PostController::class, 'index']);
Route::get('/posts/{id}', [PostController::class, 'show']);
  • le richieste GET /post verranno gestite dal metodo index classe PostController
  • le richieste GET /post/{id} verranno gestite dal metodo show classe PostController (che riceverà come parametro $id)

In alternativa, quando si hanno più rotte collegate a un controller, per esempio nei casi in cui è possibile compiere diverse azioni sulla stessa “entità”, è possibile raggruppare insieme tali rotte usando il metodo controller per definire il controller comune e indicare solo il metodo del controller da invocare sulla singola rotta.

use App\Http\Controllers\PostController;

Route::controller(PostController::class)->group(function () {
  Route::get('/posts', 'index');
  Route::get('/posts/{id}', 'show');
  Route::post('/posts', 'store');
});

Metodi di un controller e parametri in Laravel

Vediamo, ora, cosa scrivere all’interno di una classe controller per collegarlo opportunamente con una rotta. Proseguendo con l’esempio del PostController, il suo contenuto potrebbe essere simile al seguente:

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class PostController extends Controller
{
  public function index(): string
  {
    return 'List of blog posts';
  }

  public function show($id): string
  {
    return "Content for blog post $id";
  }

  public function store(Request $request): string
  {
    return 'Created new blog post';
  }
}

Possiamo notare che:

  • i controller possono estendere la classe Controller; non è necessario, ma permette di accedere, nel caso, ad alcuni metodi disponibili per questa classe
  • i nomi dei metodi della classe corrispondono a quanto indicato nella definizione della rotta, senza questa corrispondenza il metodo del controller non verrà invocato
  • i metodi del controller possono avere parametri a cui verrà passato il valore del o dei parametri della route
  • è possibile sfruttare la dependency injection per passare istanze specifiche al metodo, come, per esempio, l’istanza della Request in gestione

Convenzioni metodi HTTP e metodi del controller in Laravel

Anche se non è necessario per far funzionare la connessione tra definizione della rotta e metodi del controller, è buona pratica usare alcuni nomi convenzionali per i metodi del controller in base al tipo di richiesta che stanno gestendo. Ciò è particolarmente utile nel caso di controller che gestiscono gruppi di rotte.

Metodo HTTP URI Metodo del controller Azione
GET /posts index Elenca tutti i post
GET /posts/{id} show Mostra il post <id>
POST /posts store Crea un nuovo post
PUT/PATCH /posts/{id} update Aggiorna un post esistente
DELETE /posts/{id} destroy Elimina un post esistente

 

In questo modo sarà sempre possibile sapere facilmente e direttamente nel controller quale tipo di richiesta viene gestita da un determinato metodo.

Sapere quale controller e metodo gestisce una rotta in Laravel

Quando si esegue il comando Artisan route:list verrà evidenziato quale controller e quale metodo è collegato alla singola rotta.

$ php artisan route:list --except-vendor

 GET|HEAD  posts ...................................... PostController@index
 POST      posts ...................................... PostController@store
 GET|HEAD  posts/{id} .................................. PostController@show
 GET|HEAD  user ............................................................
 GET|HEAD  user/orders .....................................................
 GET|HEAD  user/profile ....................................................

Dependency injection in Laravel

Oltre a quanto visto per i singoli metodi, è possibile sfruttare il meccanismo della dependency injection per collegare un controller ad altre entità di un progetto Laravel.

Nel nostro esempio di controller per i post di un blog, potrebbe essere necessario recuperare dal database l’elenco dei post, o il contenuto di un singolo post oppure scrivere su database un nuovo post. Senza scendere, ora, nel dettaglio, in una applicazione Laravel è possibile definire una classe repository che serve per interfacciarsi con un database da ogni punto dell’applicazione.

È possibile sfruttare la dependency injection per rendere disponibile una istanza di tale repository aggiungendo un costruttore al nostro controller.

namespace App\Http\Controllers;

use App\Repositories\PostRepository;

class PostController extends Controller
{
  /**
  * L'istanza del repository dei post utilizzabile da ogni metodo del controller
  */
  protected $posts;

  public function __construct(PostRepository $post)
  {
    $this->posts = $posts;
  }

  // ...
}

Controller single action in Laravel

I controller single action (o invocabili) possono essere utilizzati nel caso in cui, a fronte di una richiesta HTTP, il nostro applicativo deve compiere un’ azione particolarmente complessa. In tal caso, è possibile dedicare un intero controller alla gestione della richiesta.

È possibile creare un controller single action fornendo l’opzione –invokable al comando Artisan make:controller.

php artisan make:controller ShowUpcomingEventsController --invokable

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class ShowUpcomingEventsController extends Controller
{
  /**
  * Gestisce la specifica richiesta
  *
  * @param \Illuminate\Http\Request $request
  * @return \Illuminate\Http\Response
  */
  public function __invoke(Request $request)
  {
    // elaborazione complicata per recuperare i prossimi eventi a calendario
  }
}

Nel collegare controller a rotta non è necessario specificare il metodo, poiché verrà utilizzato di default il metodo __invoke.

// in routes/web.php

Route::get('events', ShowAllEventsController::class);
Route::get('events/past', ShowPastEventsController::class);
Route::get('events/upcoming', ShowUpcomingEventsController::class);

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.