Laravel Folio
- Introducción
- Instalación
- Creando Rutas
- Parámetros de Ruta
- Vinculación de Modelos de Ruta
- Ganchos de Renderizado
- Rutas Nombradas
- Middleware
- Cacheo de Rutas
Introducción
Laravel Folio es un potente enrutador basado en páginas diseñado para simplificar el enrutamiento en aplicaciones Laravel. Con Laravel Folio, generar una ruta se vuelve tan fácil 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
, solo 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
Por defecto, 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 Laravel. Es posible que desees tener un directorio separado de páginas de Folio para el área "admin" de tu aplicación, mientras que 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 escaneará en busca de páginas al enrutear 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 de Subdominios
También puedes enrutar a páginas en función del subdominio de la solicitud entrante. Por ejemplo, es posible que desees enrutar las solicitudes de admin.example.com
a un directorio de página diferente al de el resto de tus páginas 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'));
Creando Rutas
Puedes crear una ruta de Folio colocando una plantilla Blade en cualquiera de tus directorios montados de Folio. Por defecto, 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 una plantilla de Blade haya sido colocada 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 folio:page user/profile # pages/user/profile.blade.php → /user/profile
Rutas de Índice
A veces, es posible que desees 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 enrutará a esa página:
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
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 del archivo de la página entre corchetes:
php artisan folio:page "users/[id]" # pages/users/[id].blade.php → /users/1
Los segmentos capturados pueden ser accedidos como variables dentro de tu plantilla Blade:
<div> User {{ $id }}</div>
Para capturar múltiples segmentos, puedes prefijar el segmento encapsulado con tres puntos ...
:
php artisan folio:page "users/[...ids]" # pages/users/[...ids].blade.php → /users/1/2/3
Al capturar múltiples 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>
Vínculo de Modelos de Ruta
Si un segmento comodín del nombre de archivo de la plantilla de tu página corresponde a uno de los modelos Eloquent de tu aplicación, Folio aprovechará automáticamente las capacidades de enlazado de modelos de ruta de Laravel e intentará inyectar la instancia del modelo resuelto en tu página:
php artisan folio:page "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>
Personalizando la Clave
A veces es posible que desees resolver modelos Eloquent vinculados utilizando una columna diferente a id
. Para hacerlo, puedes especificar la columna en el nombre del 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
Por defecto, 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 del modelo completamente cualificado en el nombre del archivo de tu plantilla:
php artisan folio:page "users/[.App.Models.User]" # pages/users/[.App.Models.User].blade.php → /users/1
Modelos Suavemente Eliminados
Por defecto, los modelos que han sido eliminados de forma suave no se recuperan al resolver las vinculaciones de modelos implícitas. Sin embargo, si lo deseas, puedes instruir a Folio para que recupere los 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
Por defecto, 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 una función anónima que recibirá la instancia de View
que está siendo renderizada por Folio, lo que te permitirá agregar datos adicionales a la vista o personalizar toda la respuesta. Además de recibir la instancia de View
, cualquier parámetro de ruta adicional o vinculaciones de modelo también se proporcionarán a la función anónima 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>
Rutas Nombradas
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 nombradas de Laravel, puedes usar la función route
para generar URL a páginas de Folio que han sido asignadas a 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 de las páginas a las que se deben aplicar. Se puede utilizar el carácter *
como un carácter comodín:
use Laravel\Folio\Folio; Folio::path(resource_path('views/pages'))->middleware([ 'admin/*' => [ 'auth', 'verified', // ... ],]);
Puedes incluir funciones anónimas
en el array de middleware para definir middleware en línea:
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
Al usar 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ágina de Folio y los nombres de ruta se almacenen en caché de manera adecuada para un rendimiento máximo.