Laravel – primi passi: i Controller

Spread the love

Proseguendo con l’invocazione delle rotte con Laravel, facciamo un riassunto: abbiamo visto come invocare l’applicazione usando una rotta. E abbiamo visto come si può usare il metodo statico Route::get() per associare un percorso URI (rotta) ad una funzione anonima. La quale al suo interno può emettere un output semplice (echo) oppure invocare una vista Blade.

Il passo successivo è quello di alzare il tiro ed effettuare una elaborazione più complessa a fronte dell’URI di richiesta.

Il componente naturale che viene chiamato per gestire una richesta è il controller. Come si ricorderà, il controller è il centro dell’applicazione (vedi l’articolo Laravel – primi passi – MVC) ed è quindi in questa sede che va gestito il processo.

Ma vediamo prima di tutto come creare un nuovo controller.

In generale dovremo creare un controller per ogni tabella del database:

una tabella -> un model -> un controller con diverse azioni -> diverse view, una per ogni azione, ma non solo.

Lo facciamo da Artisan con il quale, oltre a creare le migrazioni per defnire le tabelle, crea anche i Controller (e tantissime altre cose ancora):

$ php artisan make:controller CompanyController

Un piccolo inciso:

  • il comando è make:controller
  • il nome del controller va scritto in CamelCase con il nome della tabella al singolare. Questo perché se ci adeguiamo alla convenzione, ci risparmiamo tonnellate di file di configurazione da gestire (convention over configuration). In ogni caso è possibile derogare dalla convenzione agendo su opportuni file.

Per un sinottico delle convenzioni sui nomi delle variabili si consulti questo articolo.

Il comando sopra ci crea un controller vuoto (c’è sola la dichiarazione della classe), ma riempiamolo un po’. Se invece del precedente, lanciamo questo comando:

$ php artisan make:controller --resource CompanyController

il controller avrà al suo interno già definito 7 risorse che sono i metodi standard per effettuare le operazioni di CRUD sul modello:

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class CompanyController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index() // elenco di tutti i record
    {
        //
    }

    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function create() // for di inserimento nuovo record
    {
        //
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request) // salvataggio in insert
    {
        //
    }

    /**
     * Display the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function show($id) // mostra un singolo record
    {
        //
    }

    /**
     * Show the form for editing the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function edit($id) // form di modifica di un record esistente
    {
        //
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, $id) // salvataggio in update
    {
        //
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function destroy($id) // delete di un record
    {
        //
    }
}

Ora se personalizziamo nel modo seguente il metodo index():

    public function index()
    {
        return "This is the Company index";
    }

e definiamo la rotta così

Nota: dalla versione 8 di Laravel in poi, nella definzione della rotta, il controller deve essere specificato con tutto il suo namespace:

Route::get('/company', 'App\Http\Controllers\CompanyController@index');

il risultato sarà

Laravel: metodo index del controller
Laravel: metodo index del controller

È possibile anche passare parametri dalla rotta al controller. Per esempio lo faremo quendo vorremo mostrare un singolo record utlizzando il metodo show del controller; definiamo quindi la rotta nel file routes/web.php (nota il segnaposto {id} per il parametro della rotta):

Route::get('/company/{id}', 'App\Http\Controllers\CompanyController@show');

e quindi scriviamo il metodo show del CompanyController che gestice questa rotta(nota il parametro di ingresso $id):

    /**
     * Display the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function show(int $id):string
    {
        //
        return "This is company # ".$id;
    }

Il risultato è il seguente:

Metodo show per gestire la rotta
Metodo show per gestire la rotta

Ultimo paragrafo per resentare la rotta speciale resource che praticamente genera per noi tutte le rotte standard che riguardano uno stesso modello e tutti i controller stadard.

Avremo un rotta per l’index e un metodo di controller per l’index; una rotta di show e un cotnroller per lo show. e così va.

Basta creare una route di tipo resource:

Route::resource('company', 'App\Http\Controllers\CompanyController');

se ci facciamo visualizzare la tabella delle rotte da Artisan vediamo:

$ php artisan route:list

e questa è la tabella delle rotte che verrà visulizzata:

route:list con resource
route:list con resource

sono stati generati tutte le rotte, qassegnata ad ognuna un nome e associato il verbo del protocollo HTTP corrspondente (PUT/PATCH per update, POST per store e così via).

Se proviamo dal browser le varie rotte non avrò neanche un errore 404, nel senso che trova la risorsa che magari provoca un errore 500, oppure funziona: sono infatti da implementare le view che servono le rotte di tipo create, edit, update e delete. Inoltre, se si analizza la tabella delle rotte,si vedrà che l’URI non cambia al cambiare del metodo per show, update delete: in questo caso viene utilizzato un diverso verbo del protocollo HTTP!

Nel prossimo articolo farà la comparsa il model, vedremo così come il Controller chiede i dati al model.

Riferimenti

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.