Quando si realizza una sezione in Laravel occorre procedere per step distinti. Nel caso del nostro e-commerce i passaggi successivi saranno finalizzati a creare una home page che presenti dieci prodotti ordinati per prezzo in modo ascendente e con paginazione.
Il primo step sarà la realizzazione del controller che prenderà i dati dai modelli del database e restituirà una view per questa route.
Il secondo step riguarda l'implementazione della view. Per creare la home page del nostro e-commerce sfrutteremo l'ereditarietà dei template Blade definendo un template base per tutto il sito e quindi un template specifico per la home page.
Il terzo ed ultimo step è la creazione di una route collegata al controller e al suo specifico metodo definito per gestire tale route.
In questa lezione ci occuperemo nello specifico dello step riguardante il controller.
Realizzazione del controller
Creiamo un nuovo controller con il seguente comando da shell:
php artisan make:controller HomeController
Questo comando genererà il file HomeController.php
in app/Http/Controllers
con la seguente struttura iniziale.
<?php
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
class HomeController extends Controller
{
}
Ora dobbiamo includere il modello dei prodotti nel controller. Quindi scriviamo:
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use App\Product;
class HomeController extends Controller
{
}
A questo punto possiamo definire il metodo che gestirà la route della home page reperendo dieci prodotti ordinati per prezzo con l'aggiunta della paginazione.
class HomeController extends Controller
{
public function index()
{
$products = Product::orderBy('price', 'asc')->paginate(10);
return view('home', [
'title' => 'PHP E-commerce',
'products' => $products
]);
}
}
view()
accetta come primo parametro il nome del template Blade e come secondo parametro un array associativo contenente le variabili da passare alla view, ossia al template engine Blade. Anche se i template Blade hanno come nome del file nome.blade.php
, si specifica solo il nome senza la doppia estensione.
Un modo alternativo di usare questo helper globale è quello che sfrutta la funzione PHP compact()
con le variabili locali del metodo del controller.
class HomeController extends Controller
{
public function index()
{
$products = Product::orderBy('price', 'asc')->paginate(10);
$title = 'PHP E-commerce';
return view('home', compact('title', 'products');
}
}
Questa soluzione genera ugualmente l'array associativo da passare a view()
, ma come si può notare è molto più concisa.
Il metodo paginate()
genera automaticamente la logica alla base della paginazione dei dati e funziona insieme ad un metodo del modello che vedremo di seguito nella view.