1. Paquetes
  2. Laravel Folio

Introducción

Laravel Folio es un enrutador basado en páginas diseñado para simplificar el enrutamiento en aplicaciones Laravel. Con Laravel Folio, generar una ruta se vuelve tan sencillo como crear una plantilla Blade dentro del directorio resources/views/pages de tu aplicación.

Por ejemplo, para crear una página que sea accesible en la URL /greeting, simplemente crea un archivo greeting.blade.php en el directorio resources/views/pages de tu aplicación:

<div>
Hello World
</div>

Instalación

Para empezar, instala Folio en tu proyecto utilizando el gestor de paquetes Composer:

composer require laravel/folio

Después de instalar Folio, puedes ejecutar el comando Artisan folio:install, que instalará el proveedor de servicios de Folio en tu aplicación. Este proveedor de servicios registra el directorio donde Folio buscará rutas / páginas:

php artisan folio:install

Rutas / URIs de página

De forma predeterminada, Folio sirve páginas desde el directorio resources/views/pages de tu aplicación, pero puedes personalizar estos directorios en el método boot de tu proveedor de servicios de Folio.

Por ejemplo, a veces puede ser conveniente especificar múltiples rutas de Folio en la misma aplicación de Laravel. Puedes desear tener un directorio separado de páginas de Folio para el área "admin" de tu aplicación, mientras usas otro directorio para el resto de las páginas de tu aplicación.

Puedes lograr esto utilizando los métodos Folio::path y Folio::uri. El método path registra un directorio que Folio explorará en busca de páginas al enrutar las solicitudes HTTP entrantes, mientras que el método uri especifica la "URI base" para ese directorio de páginas:

use Laravel\Folio\Folio;
 
Folio::path(resource_path('views/pages/guest'))->uri('/');
 
Folio::path(resource_path('views/pages/admin'))
->uri('/admin')
->middleware([
'*' => [
'auth',
'verified',
 
// ...
],
]);

Enrutamiento por subdominios

También puedes enrutar a páginas en función del subdominio de la solicitud entrante. Por ejemplo, puedes desear enrutar las solicitudes desde admin.example.com a un directorio de páginas diferente que el resto de tus páginas de Folio. Puedes lograr esto invocando el método domain después de invocar el método Folio::path:

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

El método domain también te permite capturar partes del dominio o subdominio como parámetros. Estos parámetros se inyectarán en tu plantilla de página:

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

Creación de rutas

Puedes crear una ruta de Folio colocando una plantilla Blade en cualquiera de tus directorios montados de Folio. De forma predeterminada, Folio monta el directorio resources/views/pages, pero puedes personalizar estos directorios en el método boot de tu proveedor de servicios de Folio.

Una vez que se haya colocado una plantilla Blade en un directorio montado de Folio, puedes acceder a ella inmediatamente a través de tu navegador. Por ejemplo, una página colocada en pages/schedule.blade.php se puede acceder en tu navegador en http://example.com/schedule.

Para ver rápidamente una lista de todas tus páginas/rutas de Folio, puedes invocar el comando Artisan folio:list:

php artisan folio:list

Rutas anidadas

Puedes crear una ruta anidada creando uno o más directorios dentro de uno de los directorios de Folio. Por ejemplo, para crear una página que sea accesible a través de /user/profile, crea una plantilla profile.blade.php dentro del directorio pages/user:

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

Rutas de índice

A veces, puedes desear hacer que una página dada sea el "índice" de un directorio. Al colocar una plantilla index.blade.php dentro de un directorio de Folio, cualquier solicitud a la raíz de ese directorio se dirigirá a esa página:

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

Parámetros de ruta

A menudo, necesitarás tener segmentos de la URL de la solicitud entrante inyectados en tu página para que puedas interactuar con ellos. Por ejemplo, es posible que necesites acceder al "ID" del usuario cuyo perfil se está mostrando. Para lograr esto, puedes encapsular un segmento del nombre de archivo de la página entre corchetes:

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

Los segmentos capturados se pueden acceder como variables dentro de tu plantilla Blade:

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

Para capturar varios segmentos, puedes agregar tres puntos ... como prefijo al segmento encapsulado:

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

Cuando capturas varios segmentos, los segmentos capturados se inyectarán en la página como un array:

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

Vinculación de modelos de ruta

Si un segmento de comodín del nombre de la plantilla de tu página se corresponde con uno de los modelos Eloquent de tu aplicación, Folio aprovechará automáticamente las capacidades de enlace de modelos de ruta de Laravel e intentará inyectar la instancia del modelo resuelto en tu página:

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

Los modelos capturados se pueden acceder como variables dentro de tu plantilla Blade. El nombre de la variable del modelo se convertirá a "camel case":

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

Personalización de la clave

A veces, puedes desear resolver modelos Eloquent vinculados usando una columna que no sea id. Para hacerlo, puedes especificar la columna en el nombre de archivo de la página. Por ejemplo, una página con el nombre de archivo [Post:slug].blade.php intentará resolver el modelo vinculado a través de la columna slug en lugar de la columna id.

En Windows, debes usar - para separar el nombre del modelo de la clave: [Post-slug].blade.php.

Ubicación del modelo

De forma predeterminada, Folio buscará tu modelo dentro del directorio app/Models de tu aplicación. Sin embargo, si es necesario, puedes especificar el nombre de la clase de modelo completamente cualificado en el nombre de archivo de tu plantilla:

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

Modelos eliminados suavemente

De forma predeterminada, los modelos que han sido eliminados suavemente no se recuperan al resolver los enlaces de modelos implícitos. Sin embargo, si lo deseas, puedes indicarle a Folio que recupere modelos eliminados suavemente invocando la función withTrashed dentro de la plantilla de la página:

<?php
 
use function Laravel\Folio\{withTrashed};
 
withTrashed();
 
?>
 
<div>
User {{ $user->id }}
</div>

Hooks de renderizado

De forma predeterminada, Folio devolverá el contenido de la plantilla Blade de la página como respuesta a la solicitud entrante. Sin embargo, puedes personalizar la respuesta invocando la función render dentro de la plantilla de la página.

La función render acepta un cierre que recibirá la instancia View que está siendo renderizada por Folio, lo que te permite agregar datos adicionales a la vista o personalizar toda la respuesta. Además de recibir la instancia View, también se proporcionarán al cierre los parámetros de la ruta adicionales o las vinculaciones de modelos:

<?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>

Rutas con nombre

Puedes especificar un nombre para la ruta de una página dada utilizando la función name:

<?php
 
use function Laravel\Folio\name;
 
name('users.index');

Al igual que las rutas con nombre de Laravel, puedes utilizar la función route para generar URLs a páginas de Folio que hayan sido asignadas con un nombre:

<a href="{{ route('users.index') }}">
All Users
</a>

Si la página tiene parámetros, simplemente puedes pasar sus valores a la función route:

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

Middleware

Puedes aplicar middleware a una página específica invocando la función middleware dentro de la plantilla de la página:

<?php
 
use function Laravel\Folio\{middleware};
 
middleware(['auth', 'verified']);
 
?>
 
<div>
Dashboard
</div>

O, para asignar middleware a un grupo de páginas, puedes encadenar el método middleware después de invocar el método Folio::path.

Para especificar a qué páginas se debe aplicar el middleware, el array de middleware puede ser indexado utilizando los patrones de URL correspondientes a las páginas a las que se debe aplicar. El carácter * se puede utilizar como comodín:

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

Puedes incluir cierres en el array de middleware para definir middleware en línea y anónimo:

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);
},
],
]);

Caché de rutas

Cuando uses Folio, siempre debes aprovechar las capacidades de almacenamiento en caché de rutas de Laravel. Folio escucha el comando Artisan route:cache para asegurarse de que las definiciones de páginas de Folio y los nombres de rutas se almacenen en caché correctamente para obtener un rendimiento máximo.