Saltar al contenido principal

Introducción

Laravel Folio es un router basado en páginas que te permite definir rutas simplemente colocando archivos Blade. A diferencia de las definiciones tradicionales centradas en routes/web.php, la estructura del sistema de archivos se refleja tal cual en las URLs. Resulta especialmente útil en sitios centrados en contenido o en paneles de administración donde quieres añadir páginas con rapidez. En áreas que requieren un control HTTP muy fino, como una API, es habitual combinarlo con el enrutamiento tradicional.

Instalación

Primero añade Folio con Composer.
composer require laravel/folio
php artisan folio:install
folio:install registra el service provider de Folio. Por defecto el directorio de páginas es resources/views/pages/. Si necesitas manejar varios directorios de páginas o URIs base, configura Folio::path() y uri() en el boot de un service provider.
use Laravel\Folio\Folio;

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

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

Creación de rutas

Folio genera automáticamente URLs a partir de los nombres de los archivos Blade bajo el directorio montado.
resources/views/pages/schedule.blade.php -> /schedule
php artisan folio:list

Rutas anidadas

Al anidar directorios, la URL también queda anidada con la misma estructura.
php artisan folio:page user/profile
# pages/user/profile.blade.php -> /user/profile

Rutas índice

index.blade.php se mapea a la raíz de ese directorio.
php artisan folio:page index
# pages/index.blade.php -> /

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

Parámetros de ruta

Con los [] en el nombre del archivo puedes capturar segmentos de la URL.
php artisan folio:page "users/[id]"
# pages/users/[id].blade.php -> /users/1
<div>User {{ $id }}</div>
Para capturar varios segmentos usa ....
php artisan folio:page "users/[...ids]"
# pages/users/[...ids].blade.php -> /users/1/2/3
@foreach ($ids as $id)
    <li>User {{ $id }}</li>
@endforeach

Route model binding

Si usas el nombre del modelo, como en [User].blade.php, la resolución del modelo se hace automáticamente.
php artisan folio:page "users/[User]"
# pages/users/[User].blade.php -> /users/1
<div>User {{ $user->id }}</div>
Si necesitas incluir modelos con soft delete, llama a withTrashed() dentro de la página.
<?php

use function Laravel\Folio\withTrashed;

withTrashed();
Si escribes [Post:slug].blade.php, también podrás resolver el modelo por una clave distinta de id (por ejemplo, slug).

Middleware

Para aplicarlo solo a una página concreta, usa middleware() dentro de la plantilla.
<?php

use function Laravel\Folio\middleware;

middleware(['auth', 'verified']);
Para aplicarlo en bloque a varias páginas, usa Folio::path(...)->middleware().
<?php

use Laravel\Folio\Folio;

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

Rutas con nombre

También puedes asignar un nombre a las páginas Folio con name().
<?php

use function Laravel\Folio\name;

name('users.index');
Si en una página individual como users/[User].blade.php defines name('users.show'), podrás generar URLs con parámetros mediante route('users.show', ['user' => $user]).
Los nombres asignados se pueden usar para generar URLs con el helper route().
route('users.index');
route('users.show', ['user' => $user]);

Correspondencia entre archivos y URLs

Comparación con el enrutamiento tradicional

CaracterísticaEnrutamiento normalFolio
Definición de rutasroutes/web.phpAutomática por nombre de archivo
ControladorNecesario (o un closure)Innecesario (directamente en Blade)
Casos adecuadosAPIs, SPAs, control HTTP complejoSitios de contenido, paneles de administración
Aun usando Folio, puedes optimizar el rendimiento en producción activando la caché de rutas con php artisan route:cache.
Última modificación el 13 de julio de 2026