Folio

Introduzione

Laravel Folio è un potente router basato su pagine progettato per semplificare il routing nelle applicazioni Laravel. Con Laravel Folio, generare una route diventa semplice come creare un template Blade all’interno della directory resources/views/pages della tua applicazione.

Per esempio, per creare una pagina accessibile all’URL /greeting, basta creare un file greeting.blade.php nella directory resources/views/pages della tua applicazione:

<div>
    Hello World
</div>

Installazione

Per iniziare, installa Folio nel tuo progetto usando il package manager Composer:

composer require laravel/folio

Dopo aver installato Folio, puoi eseguire il comando Artisan folio:install, che installerà il service provider di Folio nella tua applicazione. Questo service provider registra la directory in cui Folio cercherà route / pagine:

php artisan folio:install

Percorsi delle Pagine / URI

Per impostazione predefinita, Folio fornisce le pagine dalla directory resources/views/pages della tua applicazione, ma puoi personalizzare queste directory nel metodo boot del tuo service provider di Folio.

Ad esempio, a volte può essere utile specificare più percorsi Folio nella stessa applicazione Laravel. Potresti voler avere una directory separata di pagine Folio per l’area "admin" della tua applicazione, mentre utilizzi un’altra directory per le restanti pagine della tua applicazione.

Puoi fare questo utilizzando i metodi Folio::path e Folio::uri. Il metodo path registra una directory che Folio esaminerà per le pagine durante il routing delle richieste HTTP in arrivo, mentre il metodo uri specifica l’"URI base" per quella directory di pagine:

use Laravel\Folio\Folio;

Folio::path(resource_path('views/pages/guest'))->uri('/');

Folio::path(resource_path('views/pages/admin'))
    ->uri('/admin')
    ->middleware([
        '*' => [
            'auth',
            'verified',

            // ...
        ],
    ]);

Subdomain Routing

Puoi anche instradare le richieste in base al sottodominio della richiesta in arrivo. Ad esempio, potresti voler indirizzare le richieste da admin.example.com a una directory di pagine diversa rispetto al resto delle pagine di Folio. Puoi fare ciò invocando il metodo domain dopo aver invocato il metodo Folio::path:

use Laravel\Folio\Folio;

Folio::domain('admin.example.com')
    ->path(resource_path('views/pages/admin'));

Il metodo domain permette anche di catturare parti del dominio o del sottodominio come parametri. Questi parametri verranno iniettati nel tuo template di pagina:

use Laravel\Folio\Folio;

Folio::domain('{account}.example.com')
    ->path(resource_path('views/pages/admin'));

Creare le Route

Puoi creare una route Folio posizionando un template Blade in una delle directory montate da Folio. Per impostazione predefinita, Folio monta la directory resources/views/pages, ma puoi personalizzare queste directory nel metodo boot del provider di servizi di Folio.

Una volta che un template Blade è stato posizionato in una directory montata da Folio, puoi accedervi immediatamente tramite il tuo browser. Ad esempio, una pagina posizionata in pages/schedule.blade.php può essere accessibile nel tuo browser all’indirizzo http://example.com/schedule.

Per visualizzare rapidamente un elenco di tutte le tue pagine / route Folio, puoi eseguire il comando Artisan folio:list:

php artisan folio:list

Rotte annidate

Puoi creare una rotta annidata creando una o più cartelle all’interno di una delle directory di Folio. Ad esempio, per creare una pagina accessibile tramite /user/profile, crea un template profile.blade.php nella cartella pages/user:

php artisan folio:page user/profile
# pages/user/profile.blade.php → /user/profile

Rotte Indice

A volte, potresti voler rendere una determinata pagina la "pagina indice" di una directory. Posizionando un template index.blade.php all’interno di una directory Folio, tutte le richieste alla radice di quella directory verranno indirizzate a quella pagina:

php artisan folio:page index
# pages/index.blade.php → /

php artisan folio:page users/index
# pages/users/index.blade.php → /users

Parametri della Route

Spesso è necessario inserire segmenti dell’URL della richiesta nella tua pagina per poter interagire con essi. Ad esempio, potresti dover accedere all’"ID" dell’utente il cui profilo viene mostrato. Per fare ciò, puoi racchiudere un segmento del nome del file della pagina tra parentesi quadre:

php artisan folio:page "users/[id]"
# pages/users/[id].blade.php → /users/1

I segmenti catturati possono essere accessibili come variabili all’interno del tuo template Blade:

<div>
    User {{ $id }}
</div>

Per catturare più segmenti, puoi anteporre al segmento racchiuso tre punti ...:

php artisan folio:page "users/[...ids]"
# pages/users/[...ids].blade.php → /users/1/2/3

Quando si catturano più segmenti, i segmenti catturati saranno iniettati nella pagina come un array:

```html
<ul>
    @foreach ($ids as $id)
        <li>User {{ $id }}</li>
    @endforeach
</ul>

Route Model Binding

Se una parte variabile del nome del file del tuo template di pagina corrisponde a uno dei modelli Eloquent della tua applicazione, Folio sfrutterà automaticamente le capacità di route model binding di Laravel e tenterà di iniettare l’istanza del modello risolta nella tua pagina:

php artisan folio:page "users/[User]"
# pages/users/[User].blade.php → /users/1

I modelli catturati possono essere accessibili come variabili all’interno del tuo template Blade. Il nome della variabile del modello sarà convertito in "camel case":

```html
<div>
    User {{ $user->id }}
</div>

Personalizzare la Chiave

A volte potresti voler risolvere i modelli Eloquent legati usando una colonna diversa da id. Per farlo, puoi specificare la colonna nel nome del file della pagina. Ad esempio, una pagina con il nome del file [Post:slug].blade.php cercherà di risolvere il modello legato tramite la colonna slug anziché la colonna id.

Su Windows, dovresti usare - per separare il nome del modello dalla chiave: [Post-slug].blade.php.

Posizione del Model

Di default, Folio cercherà il tuo model nella directory app/Models della tua applicazione. Tuttavia, se necessario, puoi specificare il nome completamente qualificato della classe model nel nome del file del tuo template:

php artisan folio:page "users/[.App.Models.User]"
# pages/users/[.App.Models.User].blade.php → /users/1

Soft Deleted Model

Per impostazione predefinita, i modelli che sono stati soft deleted non vengono recuperati durante la risoluzione dei binding impliciti dei modelli. Tuttavia, se lo desideri, puoi istruire Folio a recuperare i modelli soft deleted invocando la funzione withTrashed all’interno del template della pagina:

<?php

use function Laravel\Folio\{withTrashed};

withTrashed();

?>

<div>
    User {{ $user->id }}
</div>

Render Hooks

Di default, Folio restituisce il contenuto del template Blade della pagina come risposta alla richiesta in arrivo. Tuttavia, puoi personalizzare la risposta invocando la funzione render all’interno del template della pagina.

La funzione render accetta una closure che riceverà l’istanza di View che Folio sta renderizzando, permettendoti di aggiungere dati aggiuntivi alla view o personalizzare l’intera risposta. Oltre a ricevere l’istanza di View, qualsiasi parametro di rotta aggiuntivo o binding di modello sarà fornito alla closure render:

<?php

use App\Models\Post;
use Illuminate\Support\Facades\Auth;
use Illuminate\View\View;

use function Laravel\Folio\render;

render(function (View $view, Post $post) {
    if (! Auth::user()->can('view', $post)) {
        return response('Unauthorized', 403);
    }

    return $view->with('photos', $post->author->photos);
}); ?>

<div>
    {{ $post->content }}
</div>

<div>
    This author has also taken {{ count($photos) }} photos.
</div>

Rotte Nominate

Puoi specificare un nome per la route di una determinata pagina usando la funzione name:

<?php

use function Laravel\Folio\name;

name('users.index');

Proprio come le rotte nominate di Laravel, puoi usare la funzione route per generare URL per le pagine di Folio a cui è stato assegnato un nome:

<a href="{{ route('users.index') }}">
    Tutti gli Utenti
</a>

Se la pagina ha dei parametri, puoi semplicemente passare i loro valori alla funzione route:

route('users.show', ['user' => $user]);

Middleware

Puoi applicare un middleware a una pagina specifica invocando la funzione middleware all’interno del template della pagina:

<?php

use function Laravel\Folio\{middleware};

middleware(['auth', 'verified']);

?>

<div>
    Dashboard
</div>

Oppure, per assegnare un middleware a un gruppo di pagine, puoi concatenare il metodo middleware dopo aver invocato il metodo Folio::path.

Per specificare a quali pagine applicare il middleware, l’array di middleware può essere indicizzato utilizzando i pattern URL corrispondenti delle pagine a cui devono essere applicati. Il carattere * può essere utilizzato come jolly:

use Laravel\Folio\Folio;

Folio::path(resource_path('views/pages'))->middleware([
    'admin/*' => [
        'auth',
        'verified',

        // ...
    ],
]);

Puoi includere delle closure nell’array di middleware per definire middleware anonimi e inline:

use Closure;
use Illuminate\Http\Request;
use Laravel\Folio\Folio;

Folio::path(resource_path('views/pages'))->middleware([
    'admin/*' => [
        'auth',
        'verified',

        function (Request $request, Closure $next) {
            // ...

            return $next($request);
        },
    ],
]);

Caching delle Rotte

Quando usi Folio, dovresti sempre sfruttare le capacità di caching delle rotte di Laravel. Folio ascolta il comando Artisan route:cache per assicurarsi che le definizioni delle pagine e i nomi delle rotte di Folio siano correttamente memorizzati nella cache per ottenere le migliori prestazioni.

Lascia un commento

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *