> ## Documentation Index
> Fetch the complete documentation index at: https://kawax.biz/llms.txt
> Use this file to discover all available pages before exploring further.

# Laravel Folio

> Explicamos cómo implementar enrutamiento basado en archivos con Laravel Folio, desde la instalación hasta el route model binding.

## 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.

```bash theme={null}
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.

```php theme={null}
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.

```text theme={null}
resources/views/pages/schedule.blade.php -> /schedule
```

```bash theme={null}
php artisan folio:list
```

### Rutas anidadas

Al anidar directorios, la URL también queda anidada con la misma estructura.

```bash theme={null}
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.

```bash theme={null}
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.

```bash theme={null}
php artisan folio:page "users/[id]"
# pages/users/[id].blade.php -> /users/1
```

```blade theme={null}
<div>User {{ $id }}</div>
```

Para capturar varios segmentos usa `...`.

```bash theme={null}
php artisan folio:page "users/[...ids]"
# pages/users/[...ids].blade.php -> /users/1/2/3
```

```blade theme={null}
@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.

```bash theme={null}
php artisan folio:page "users/[User]"
# pages/users/[User].blade.php -> /users/1
```

```blade theme={null}
<div>User {{ $user->id }}</div>
```

Si necesitas incluir modelos con soft delete, llama a `withTrashed()` dentro de la página.

```php theme={null}
<?php

use function Laravel\Folio\withTrashed;

withTrashed();
```

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

## Middleware

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

```php theme={null}
<?php

use function Laravel\Folio\middleware;

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

Para aplicarlo en bloque a varias páginas, usa `Folio::path(...)->middleware()`.

```php theme={null}
<?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 theme={null}
<?php

use function Laravel\Folio\name;

name('users.index');
```

<Info>
  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])`.
</Info>

Los nombres asignados se pueden usar para generar URLs con el helper `route()`.

```php theme={null}
route('users.index');
route('users.show', ['user' => $user]);
```

## Correspondencia entre archivos y URLs

```mermaid theme={null}
graph LR
  A["pages/index.blade.php"] --> B["/"]
  C["pages/about.blade.php"] --> D["/about"]
  E["pages/users/[User].blade.php"] --> F["/users/1"]
```

## Comparación con el enrutamiento tradicional

| Característica      | Enrutamiento normal               | Folio                                          |
| ------------------- | --------------------------------- | ---------------------------------------------- |
| Definición de rutas | `routes/web.php`                  | Automática por nombre de archivo               |
| Controlador         | Necesario (o un closure)          | Innecesario (directamente en Blade)            |
| Casos adecuados     | APIs, SPAs, control HTTP complejo | Sitios de contenido, paneles de administración |

<Tip>
  Aun usando Folio, puedes optimizar el rendimiento en producción activando la caché de rutas con `php artisan route:cache`.
</Tip>


## Related topics

- [Estructura de aplicación en Laravel 11 y posteriores](/es/advanced/app-structure.md)
- [Laravel Boost](/es/boost.md)
- [Laravel Telescope](/es/telescope.md)
- [Laravel Bluesky](/es/packages/laravel-bluesky/index.md)
- [Laravel Octane](/es/octane.md)
