Con Laravel è semplice impostare la paginazione dei dati nelle view.
Creare il 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 dati 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 modelli di dati 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' => 'Site',
'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 = 'Site';
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.
Creare la view
Il template della home page (views/home.blade.php
) avrà allora questa struttura.
@extends('layouts.site')
@section('content')
<section class="row products">
@foreach($products as $product)
@include('product', ['product' => $product])
@endforeach
{{ $products->links() }}
</section>
@endsection
Blade usa il punto come separatore delle directory e non lo slash. Quindi il file layouts/site.blade.php
verrà richiamato come layouts.site
.
Il metodo links()
genera la struttura HTML della paginazione dei prodotti, che è già compatibile con Bootstrap.