Laravel 8, la versione più recente del framework creato da Taylor Otwell, è stata rilasciato l’8 settembre. Le modifiche strutturali e funzionali rilasciate indicano che il framework assumerà un aspetto sempre più ben strutturato e ci darà la possibilità di creare programmi sempre più complessi.
Vediamo quali sono le principali novità:
- Models directory
- Model based factory
- Migrations squashing
- Laravel Jetstream
- Manteinance mode
- Instradamento
- Laravel Livewire
Models directory
La prima differenza tra la nuova e la vecchia versione del framework è la presenza della cartella dedicata ai modelli. Nella vecchia versione, i modelli si trovavano nel namespace app come file liberi. Nella nuova versione hanno una cartella dedicata chiamata models che possiamo trovare nel namespace app.
Model based factory
In questa ultima versione di Laravel, le factories hanno assunto un aspetto più complesso rispetto alla versione precedente.
In Laravel 7, per creare degli oggetti per testare le funzionalità, dovevamo creare una factory e applicarla su un modello con una precisa descrizione.
Vediamo un esempio:
In questo caso, dovevamo specificare alla factory che avrebbe dovuto creare un oggetto di classe User.
In Laravel 8 le factories sono classi che estendono la classe factory e sono model based, il che vuol dire che una factory ha una responsabilità unica verso un’unica classe.
Nella factory ora sono presenti l’attributo model, che specifica qual è la classe a cui la factory fa riferimento e il metodo definition, che restituisce gli attributi del modello.
Anche in Laravel 8 le factories hanno accesso ai metodi di Faker.
Nei modelli, invece, è stato aggiunto il trait HasFactory, permettendo così alla factory di agire sul modello.
Laravel Jetstream
Laravel Jetstream è un ottimo strumento per creare uno scaffolding di partenza per la gestione dell’utente.
Ci sono due modi per poter utilizzare jetstream:
- creare il nuovo progetto laravel con jetstream incluso tramite il comando
laravel new NomeProgetto –jet
- includere Jetstram nel progetto dopo aver creato l’applicazione laravel tramite il comando
composer require laravel/jetstream
Jetstream fornisce un punto di partenza perfetto per il progetto, includendo login e register, verifica e-mail, autenticazione a due fattori, gestione delle sessioni e molto altro.
Per maggiori info: Jetstream Installation
Squashing delle migrazioni
Durante lo sviluppo del tuo progetto, potresti trovarti nell’esigenza di creare tante migrazioni per strutturare il tuo database e, di conseguenza, riempire la cartella delle migrazioni fino a farla esplodere.
Lo squashing delle migrazioni risolve questo problema.
Grazie al comando php artisan schema:dump, tutte le migrazioni verranno riportate in un file SQL e, aggiungendo l’estensione —prune, tutte le migrazioni presenti in quel momento, verranno eliminate dalla cartella database/migrations.
Il file creato con il comando php artisan schema:dump , si trova nella cartella database/schema.
Se dovessi creare altre migrazioni dopo aver lanciato il comando, otterresti dei file migration nella cartella database/migrations.
Manteinance mode
La modalità manutenzione è una funzione che permette di disabilitare temporaneamente l’applicazione che stai aggiornando.
Nella versione 7, bastava concatenare l’opzione — allow con un indirizzo ip per permettere l’accesso.
Nella versione 8, invece, non è più necessario specificare gli indirizzi IP permessi, basterà generare un token da associare al comando php artisan down —secret=”token” e aggiungere il token all’URL per essere autorizzati ad entrare nell’applicazione.
Instradamento
In Laravel 8, la proprietà namespace in app/Providers/RouteServiceProvider.php è di default null.
Nelle versioni precedenti, questa proprietà era valorizzata con il namespace App/Http/Controllers.
Questo cambiamento implica che nelle funzioni Route non c’è più il prefisso automatico nel namespace e che non possiamo più utilizzare la sintassi.
Ora, per richiamare una funzione controller di un determinato controller, dobbiamo includere il suo namespace nel file web.php e utilizzare la seguente sintassi
Attenzione, cari nostalgici, se proprio non potete fare a meno di utilizzare il caro vecchio metodo, vi basterà modificare il valore di $namespace nel RouteServiceProvider con il path App/Http/Controllers
Laravel Livewire
Per la gestione dell’utente tramite Jetstream, Laravel include Livewire nel nostro progetto.
Livewire è un full stack framework che sta diventando sempre più popolare nel mondo Laravel.
La sua filosofia è semplice ma molto potente: collega i dati che abbiamo nel back-end con i dati che mostriamo nel front-end in tempo reale. Non è una novità, starete pensando. E avete ragione. Ma la novità sta nel fatto che, a differenza di Vue.js, non abbiamo bisogno di interrogare il backend tramite chiamate Ajax e far ritornare i dati nel frontend per poi rimontarli. È Livewire ad occuparsi di rimontare il componente con il suo HTML e riportarlo nel frontend.
Tutto ciò viene fatto utilizzando i metodi scritti in PHP presenti nel componente back-end che vengono richiamati tramite eventi di JavaScript.
Facciamo un esempio:
Immaginiamo di avere un componente che gestice l’inserimento di un contatto nel database.
Un contatto, per essere salvato, ha bisogno di nome, email e password.
Creiamo il componente dove avremo la nostra logica back-end:
<?php
namespace App\Http\Livewire;
use App\Models\Contact;
use Livewire\Component;
class ContactManager extends Component
{
public $contact_name;
public $contact_email;
public $contact_password;
public function saveContact()
{
$newContact = new Contact();
$newContact->name = $this->contact_name;
$newContact->email = $this->contactemail;
$newContact->password = $this->contact_password;
$newContact->save();
}
public function render()
{
return view('livewire.contact-manager');
}
}
Come possiamo vedere, ogni componente ha un proprio stato di memoria, costituito dalle proprietà presenti in esso. In questo caso, le proprietà sono contact_name, contact_email, contact_password.
Creiamo la vista che sarà collegata al componente
Livewire riesce a collegare le proprietà del componente con i rispettivi input nel front-end tramite la direttiva wire:model.
Quando andiamo a cambiare il valore dell’input, questo verrà salvato nello stato della memoria del componente back-end in tempo reale, senza creare funzionalità particolari.
Tutto questo è possibile grazie al JavaScript presente in Livewire che cattura l’evento onchange nell’input e invia i dati al componente back-end.
Per quanto riguarda il salvataggio, invece, Livewire catturerà l’evento click sul bottone e farà partire la chiamata alla funzione saveContact presente nel componente back-end che, come possiamo vedere, creerà una nuova istanza di Contact, assocerà il valore delle proprietà presenti nel suo stato in quel momento e salverò i dati nel database.
Tutto questo utilizzando PHP!