- Introducción
-
Herencia de plantilla
- Definición de un diseño
- Ampliación de un diseño
-
Visualización de datos
- Frameworks Blade y JavaScript
-
Estructuras de Control
- Si declaraciones
- Cambiar declaraciones
- Bucles
- La variable de bucle
- Comentarios
- PHP
- los
@once
Directiva
-
Formularios
- Campo CSRF
- Campo de método
- Errores de validación
-
Componentes
- Visualización de componentes
- Pasar datos a componentes
- Administrar atributos
- Ranuras
- Vistas de componentes en línea
- Componentes anónimos
- Componentes dinámicos
-
Incluyendo subvistas
- Representación de vistas para colecciones
- Pilas
- Inyección de servicio
-
Hoja extensible
- Declaraciones If personalizadas
Introducción
Blade es el motor de plantillas simple pero poderoso provisto con Laravel. A diferencia de otros motores de plantillas PHP populares, Blade no le impide usar código PHP simple en sus vistas. De hecho, todas las vistas de Blade se compilan en código PHP simple y se almacenan en caché hasta que se modifican, lo que significa que Blade agrega esencialmente cero gastos generales a su aplicación. Los archivos de vista de hoja utilizan el .blade.php
extensión de archivo y normalmente se almacenan en la resources/views
directorio.
Herencia de plantilla
Definición de un diseño
Dos de los principales beneficios de usar Blade son herencia de plantilla y secciones. Para empezar, echemos un vistazo a un ejemplo sencillo. Primero, examinaremos un diseño de página “maestro”. Dado que la mayoría de las aplicaciones web mantienen el mismo diseño general en varias páginas, es conveniente definir este diseño como una sola vista Blade:
<!-- Stored in resources/views/layouts/app.blade.php --> <html> <head> <title>App Name - @yield('title')</title> </head> <body> @section('sidebar') This is the master sidebar. @show <div class="https://foroayuda.es/laravel/docs/8.x/container"> @yield('content') </div> </body> </html>
Como puede ver, este archivo contiene un marcado HTML típico. Sin embargo, tome nota de la @section
y @yield
directivas. los @section
directiva, como su nombre lo indica, define una sección de contenido, mientras que la @yield
La directiva se utiliza para mostrar el contenido de una sección determinada.
Ahora que hemos definido un diseño para nuestra aplicación, definamos una página secundaria que herede el diseño.
Ampliación de un diseño
Al definir una vista secundaria, use la hoja @extends
directiva para especificar qué diseño debe “heredar” la vista secundaria. Las vistas que extienden un diseño Blade pueden inyectar contenido en las secciones del diseño usando @section
directivas. Recuerde, como se ve en el ejemplo anterior, el contenido de estas secciones se mostrará en el diseño usando @yield
:
<!-- Stored in resources/views/child.blade.php --> @extends('layouts.app') @section('title', 'Page Title') @section('sidebar') @parent <p>This is appended to the master sidebar.</p> @endsection @section('content') <p>This is my body content.</p> @endsection
En este ejemplo, el sidebar
sección está utilizando el @parent
directiva para agregar (en lugar de sobrescribir) contenido a la barra lateral del diseño. los @parent
La directiva será reemplazada por el contenido del diseño cuando se renderice la vista.
Contrariamente al ejemplo anterior, este
sidebar
la sección termina con@endsection
en lugar de@show
. los@endsection
La directiva solo definirá una sección mientras@show
definirá y ceder inmediatamente la sección.
los @yield
La directiva también acepta un valor predeterminado como segundo parámetro. Este valor se representará si la sección que se obtiene no está definida:
@yield('content', View::make('view.name'))
Las vistas de la hoja pueden devolverse de las rutas utilizando el global view
ayudante:
Route::get('blade', function () { return view('child'); });
Visualización de datos
Puede mostrar los datos pasados a sus vistas de Blade envolviendo la variable entre llaves. Por ejemplo, dada la siguiente ruta:
Route::get('greeting', function () { return view('welcome', ['name' => 'Samantha']); });
Puede mostrar el contenido del name
variable así:
Hello, {{ $name }}.
Espada
{{ }}
las declaraciones se envían automáticamente a través de PHPhtmlspecialchars
función para prevenir ataques XSS.
No está limitado a mostrar el contenido de las variables pasadas a la vista. También puede hacer eco de los resultados de cualquier función de PHP. De hecho, puede poner cualquier código PHP que desee dentro de una declaración de eco de Blade:
The current UNIX timestamp is {{ time() }}.
Visualización de datos sin escape
Por defecto, Blade {{ }}
las declaraciones se envían automáticamente a través de PHP htmlspecialchars
función para prevenir ataques XSS. Si no desea que se escapen sus datos, puede utilizar la siguiente sintaxis:
Hello, {!! $name !!}.
Tenga mucho cuidado al hacer eco de contenido proporcionado por los usuarios de su aplicación. Utilice siempre la sintaxis de doble llave de escape para evitar ataques XSS al mostrar datos proporcionados por el usuario.
Representación de JSON
A veces, puede pasar una matriz a su vista con la intención de representarla como JSON para inicializar una variable de JavaScript. Por ejemplo:
<script> var app = <?php echo json_encode($array); ?>; </script>
Sin embargo, en lugar de llamar manualmente json_encode
, puede utilizar el @json
Directiva Blade. los @json
La directiva acepta los mismos argumentos que PHP json_encode
función:
<script> var app = @json($array); var app = @json($array, JSON_PRETTY_PRINT); </script>
Solo debes usar el
@json
directiva para representar las variables existentes como JSON. La plantilla Blade se basa en expresiones regulares y los intentos de pasar una expresión compleja a la directiva pueden provocar fallos inesperados.
Codificación de entidad HTML
Por defecto, Blade (y Laravel e
helper) codificará dos veces las entidades HTML. Si desea deshabilitar la codificación doble, llame al Blade::withoutDoubleEncoding
método del boot
método de tu AppServiceProvider
:
<?php
namespace AppProviders;
use IlluminateSupportFacadesBlade;
use IlluminateSupportServiceProvider;
class AppServiceProvider extends ServiceProvider
{
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
Blade::withoutDoubleEncoding();
}
}
Frameworks Blade y JavaScript
Dado que muchos marcos de JavaScript también utilizan llaves “rizadas” para indicar que una expresión determinada debe mostrarse en el navegador, puede utilizar la @
símbolo para informar al motor de renderizado Blade que una expresión debe permanecer intacta. Por ejemplo:
<h1>Laravel</h1> Hello, @{{ name }}.
En este ejemplo, el @
Blade eliminará el símbolo; sin embargo, {{ name }}
La expresión permanecerá intacta por el motor Blade, lo que permitirá que su marco JavaScript la represente.
los @
El símbolo también se puede usar para escapar de las directivas Blade:
{{-- Blade --}} @@json() <!-- HTML output --> @json()
los @verbatim
Directiva
Si muestra variables de JavaScript en una gran parte de su plantilla, puede ajustar el HTML en el @verbatim
directiva para que no tenga que anteponer cada declaración de eco de Blade con una @
símbolo:
@verbatim <div class="https://foroayuda.es/laravel/docs/8.x/container"> Hello, {{ name }}. </div> @endverbatim
Estructuras de Control
Además de la herencia de plantillas y la visualización de datos, Blade también proporciona accesos directos convenientes para estructuras de control PHP comunes, como declaraciones condicionales y bucles. Estos atajos proporcionan una forma muy clara y concisa de trabajar con las estructuras de control de PHP, sin dejar de ser familiares para sus contrapartes de PHP.
Si declaraciones
Puedes construir if
declaraciones usando el @if
, @elseif
, @else
, y @endif
directivas. Estas directivas funcionan de manera idéntica a sus contrapartes de PHP:
@if (count($records) === 1) I have one record! @elseif (count($records) > 1) I have multiple records! @else I don't have any records! @endif
Para mayor comodidad, Blade también proporciona un @unless
directiva:
@unless (Auth::check()) You are not signed in. @endunless
Además de las directivas condicionales ya discutidas, el @isset
y @empty
Las directivas pueden usarse como atajos convenientes para sus respectivas funciones PHP:
@isset($records) // $records is defined and is not null... @endisset @empty($records) // $records is "empty"... @endempty
Directivas de autenticación
los @auth
y @guest
Las directivas se pueden utilizar para determinar rápidamente si el usuario actual está autenticado o es un invitado:
@auth // The user is authenticated... @endauth @guest // The user is not authenticated... @endguest
Si es necesario, puede especificar la protección de autenticación que debe comprobarse al utilizar el @auth
y @guest
directivas:
@auth('admin') // The user is authenticated... @endauth @guest('admin') // The user is not authenticated... @endguest
Directivas de sección
Puede comprobar si una sección tiene contenido utilizando el @hasSection
directiva:
@hasSection('navigation') <div class="pull-right"> @yield('navigation') </div> <div class="clearfix"></div> @endif
Puede utilizar el sectionMissing
directiva para determinar si una sección no tiene contenido:
@sectionMissing('navigation') <div class="pull-right"> @include('default-navigation') </div> @endif
Directivas medioambientales
Puede comprobar si la aplicación se está ejecutando en el entorno de producción utilizando el @production
directiva:
@production
// Production specific content...
@endproduction
O puede determinar si la aplicación se está ejecutando en un entorno específico utilizando el @env
directiva:
@env('staging') // The application is running in "staging"... @endenv @env(['staging', 'production']) // The application is running in "staging" or "production"... @endenv
Cambiar declaraciones
Las sentencias de cambio se pueden construir usando el @switch
, @case
, @break
, @default
y @endswitch
directivas:
@switch($i) @case(1) First case... @break @case(2) Second case... @break @default Default case... @endswitch
Bucles
Además de las declaraciones condicionales, Blade proporciona directivas simples para trabajar con estructuras de bucle de PHP. Nuevamente, cada una de estas directivas funciona de manera idéntica a sus contrapartes de PHP:
@for ($i = 0; $i < 10; $i++) The current value is {{ $i }} @endfor @foreach ($users as $user) <p>This is user {{ $user->id }}</p> @endforeach @forelse ($users as $user) <li>{{ $user->name }}</li> @empty <p>No users</p> @endforelse @while (true) <p>I'm looping forever.</p> @endwhile
Al realizar un bucle, puede utilizar la variable de bucle para obtener información valiosa sobre el bucle, como si se encuentra en la primera o la última iteración a través del bucle.
Al usar bucles, también puede finalizar el bucle u omitir la iteración actual:
@foreach ($users as $user) @if ($user->type == 1) @continue @endif <li>{{ $user->name }}</li> @if ($user->number == 5) @break @endif @endforeach
También puede incluir la condición con la declaración de directiva en una línea:
@foreach ($users as $user) @continue($user->type == 1) <li>{{ $user->name }}</li> @break($user->number == 5) @endforeach
La variable de bucle
Al realizar un bucle, $loop
La variable estará disponible dentro de su bucle. Esta variable proporciona acceso a algunos bits de información útiles, como el índice del bucle actual y si esta es la primera o la última iteración a través del bucle:
@foreach ($users as $user) @if ($loop->first) This is the first iteration. @endif @if ($loop->last) This is the last iteration. @endif <p>This is user {{ $user->id }}</p> @endforeach
Si está en un bucle anidado, puede acceder al bucle principal $loop
variable a través de la parent
propiedad:
@foreach ($users as $user) @foreach ($user->posts as $post) @if ($loop->parent->first) This is first iteration of the parent loop. @endif @endforeach @endforeach
los $loop
La variable también contiene una variedad de otras propiedades útiles:
Propiedad | Descripción |
---|---|
$loop->index |
El índice de la iteración del ciclo actual (comienza en 0). |
$loop->iteration |
La iteración del ciclo actual (comienza en 1). |
$loop->remaining |
Las iteraciones que quedan en el ciclo. |
$loop->count |
El número total de elementos de la matriz que se iteran. |
$loop->first |
Si esta es la primera iteración a través del ciclo. |
$loop->last |
Si esta es la última iteración del ciclo. |
$loop->even |
Si se trata de una iteración uniforme a través del ciclo. |
$loop->odd |
Si se trata de una iteración extraña a través del ciclo. |
$loop->depth |
El nivel de anidamiento del bucle actual. |
$loop->parent |
Cuando está en un bucle anidado, la variable del bucle principal. |
Comentarios
Blade también le permite definir comentarios en sus vistas. Sin embargo, a diferencia de los comentarios HTML, los comentarios Blade no se incluyen en el HTML devuelto por su aplicación:
{{-- This comment will not be present in the rendered HTML --}}
PHP
En algunas situaciones, es útil incrustar código PHP en sus vistas. Puedes usar la hoja @php
directiva para ejecutar un bloque de PHP simple dentro de su plantilla:
@php
//
@endphp
Si bien Blade ofrece esta función, usarla con frecuencia puede ser una señal de que tiene demasiada lógica incrustada en su plantilla.
los @once
Directiva
los @once
La directiva le permite definir una parte de la plantilla que solo se evaluará una vez por ciclo de renderizado. Esto puede ser útil para insertar una determinada parte de JavaScript en el encabezado de la página utilizando pilas. Por ejemplo, si está renderizando un componente dado dentro de un bucle, es posible que solo desee enviar JavaScript al encabezado la primera vez que se renderiza el componente:
@once @push('scripts') <script> // Your custom JavaScript... </script> @endpush @endonce
Formularios
Campo CSRF
Siempre que defina un formulario HTML en su aplicación, debe incluir un campo de token CSRF oculto en el formulario para que el middleware de protección CSRF pueda validar la solicitud. Puede utilizar el @csrf
Directiva Blade para generar el campo token:
<form method="POST" action="/profile"> @csrf ... </form>
Campo de método
Dado que los formularios HTML no pueden hacer PUT
, PATCH
, o DELETE
solicitudes, deberá agregar un _method
campo para suplantar estos verbos HTTP. los @method
La directiva Blade puede crear este campo para usted:
<form action="/foo/bar" method="POST"> @method('PUT') ... </form>
Errores de validación
los @error
La directiva se puede utilizar para comprobar rápidamente si existen mensajes de error de validación para un atributo determinado. Dentro de un @error
directiva, puede hacerse eco de la $message
variable para mostrar el error mensaje:
<!-- /resources/views/post/create.blade.php --> <label for="title">Post Title</label> <input id="title" type="text" class="@error('title') is-invalid @enderror"> @error('title') <div class="alert alert-danger">{{ $message }}</div> @enderror
Puede pasar el nombre de una bolsa de error específica como segundo parámetro al @error
directiva para recuperar mensajes de error de validación en páginas que contienen varios formularios:
<!-- /resources/views/auth.blade.php --> <label for="email">Email address</label> <input id="email" type="email" class="@error('email', 'login') is-invalid @enderror"> @error('email', 'login') <div class="alert alert-danger">{{ $message }}</div> @enderror
Componentes
Los componentes y las ranuras brindan beneficios similares a las secciones y diseños; sin embargo, algunos pueden encontrar el modelo mental de componentes y ranuras más fácil de entender. Hay dos enfoques para escribir componentes: componentes basados en clases y componentes anónimos.
Para crear un componente basado en clases, puede usar el make:component
Mando artesanal. Para ilustrar cómo utilizar los componentes, crearemos un sencillo Alert
componente. los make:component
comando colocará el componente en el AppViewComponents
directorio:
php artisan make:component Alert
los make:component
El comando también creará una plantilla de vista para el componente. La vista se colocará en el resources/views/components
directorio.
Registro manual de componentes del paquete
Al escribir componentes para su propia aplicación, los componentes se descubren automáticamente dentro del app/View/Components
directorio y resources/views/components
directorio.
Sin embargo, si está creando un paquete que utiliza componentes Blade, deberá registrar manualmente su clase de componente y su alias de etiqueta HTML. Por lo general, debe registrar sus componentes en el boot
método del proveedor de servicios de su paquete:
use IlluminateSupportFacadesBlade; /** * Bootstrap your package's services. */ public function boot() { Blade::component('package-alert', AlertComponent::class); }
Una vez que su componente ha sido registrado, puede ser renderizado usando su alias de etiqueta:
<x-package-alert/>
Alternativamente, puede utilizar el componentNamespace
método para autocargar clases de componentes por convención. Por ejemplo, un Nightshade
el paquete puede tener Calendar
y ColorPicker
componentes que residen dentro del PackageViewsComponents
espacio de nombres:
use IlluminateSupportFacadesBlade; /** * Bootstrap your package's services. */ public function boot() { Blade::componentNamespace('Nightshade\Views\Components', 'nightshade'); }
Esto permitirá el uso de los componentes del paquete por el espacio de nombres de su proveedor utilizando el package-name::
sintaxis:
<x-nightshade::calendar /> <x-nightshade::color-picker />
Blade detectará automáticamente la clase que está vinculada a este componente colocando en mayúsculas y minúsculas el nombre del componente. Los subdirectorios también son compatibles con la notación de “puntos”.
Visualización de componentes
Para mostrar un componente, puede utilizar una etiqueta de componente Blade dentro de una de sus plantillas Blade. Las etiquetas de los componentes de la hoja comienzan con la cadena x-
seguido del nombre de caso de kebab de la clase de componente:
<x-alert/> <x-user-profile/>
Si la clase de componente está anidada más profundamente dentro del AppViewComponents
directorio, puede utilizar el .
carácter para indicar el anidamiento de directorios. Por ejemplo, si asumimos que un componente está ubicado en AppViewComponentsInputsButton.php
, podemos representarlo así:
<x-inputs.button/>
Pasar datos a componentes
Puede pasar datos a los componentes Blade utilizando atributos HTML. Los valores primitivos codificados de forma rígida se pueden pasar al componente utilizando atributos HTML simples. Las expresiones y variables de PHP deben pasarse al componente a través de atributos que utilizan el :
carácter como prefijo:
<x-alert type="error" :message="$message"/>
Debe definir los datos requeridos del componente en su constructor de clases. Todas las propiedades públicas de un componente se pondrán automáticamente a disposición de la vista del componente. No es necesario pasar los datos a la vista desde el componente render
método:
<?php
namespace AppViewComponents;
use IlluminateViewComponent;
class Alert extends Component
{
/**
* The alert type.
*
* @var string
*/
public $type;
/**
* The alert message.
*
* @var string
*/
public $message;
/**
* Create the component instance.
*
* @param string $type
* @param string $message
* @return void
*/
public function __construct($type, $message)
{
$this->type = $type;
$this->message = $message;
}
/**
* Get the view / contents that represent the component.
*
* @return IlluminateViewView|Closure|string
*/
public function render()
{
return view('components.alert');
}
}
Cuando se procesa su componente, puede mostrar el contenido de las variables públicas de su componente haciendo eco de las variables por nombre:
<div class="alert alert-{{ $type }}"> {{ $message }} </div>
Caja
Los argumentos del constructor de componentes deben especificarse usando camelCase
, tiempo kebab-case
debe usarse al hacer referencia a los nombres de los argumentos en sus atributos HTML. Por ejemplo, dado el siguiente constructor de componentes:
/** * Create the component instance. * * @param string $alertType * @return void */ public function __construct($alertType) { $this->alertType = $alertType; }
los $alertType
El argumento se puede proporcionar así:
<x-alert alert-type="danger" />
Métodos de componentes
Además de que las variables públicas estén disponibles para la plantilla de su componente, también se puede ejecutar cualquier método público en el componente. Por ejemplo, imagine un componente que tiene un isSelected
método:
/** * Determine if the given option is the current selected option. * * @param string $option * @return bool */ public function isSelected($option) { return $option === $this->selected; }
Puede ejecutar este método desde la plantilla de su componente invocando la variable que coincida con el nombre del método:
<option {{ $isSelected($value) ? 'selected="selected"' : '' }} value="{{ $value }}"> {{ $label }} </option>
Uso de atributos y espacios dentro de la clase
Los componentes Blade también le permiten acceder al nombre del componente, los atributos y la ranura dentro del método de renderizado de la clase. Sin embargo, para acceder a estos datos, debe devolver un cierre de la render
método. El Cierre recibirá un $data
matriz como su único argumento:
/** * Get the view / contents that represent the component. * * @return IlluminateViewView|Closure|string */ public function render() { return function (array $data) { // $data['componentName']; // $data['attributes']; // $data['slot']; return '<div>Components content</div>'; }; }
los componentName
es igual al nombre utilizado en la etiqueta HTML después de la x-
prefijo. Entonces <x-alert />
‘s componentName
estarán alert
. los attributes
contendrá todos los atributos que estaban presentes en la etiqueta HTML. los slot
elemento es un IlluminateSupportHtmlString
instancia con el contenido de la ranura del componente.
El cierre debe devolver una cadena. Si la cadena devuelta corresponde a una vista existente, esa vista se renderizará; de lo contrario, la cadena devuelta se evaluará como una vista Blade en línea.
dependencias adicionales
Si su componente requiere dependencias del contenedor de servicios de Laravel, puede enumerarlas antes de cualquiera de los atributos de datos del componente y el contenedor las inyectará automáticamente:
use AppServicesAlertCreator /** * Create the component instance. * * @param AppServicesAlertCreator $creator * @param string $type * @param string $message * @return void */ public function __construct(AlertCreator $creator, $type, $message) { $this->creator = $creator; $this->type = $type; $this->message = $message; }
Administrar atributos
Ya hemos examinado cómo pasar atributos de datos a un componente; sin embargo, a veces es posible que deba especificar atributos HTML adicionales, como class
, que no forman parte de los datos necesarios para que funcione un componente. Normalmente, desea pasar estos atributos adicionales al elemento raíz de la plantilla de componente. Por ejemplo, imagina que queremos renderizar un alert
componente así:
<x-alert type="error" :message="$message" class="mt-4"/>
Todos los atributos que no forman parte del constructor del componente se agregarán automáticamente a la “bolsa de atributos” del componente. Esta bolsa de atributos se pone automáticamente a disposición del componente a través del $attributes
variable. Todos los atributos se pueden representar dentro del componente repitiendo esta variable:
<div {{ $attributes }}> <!-- Component Content --> </div>
Usando directivas como
@env
directamente en un componente no es compatible en este momento.
Atributos predeterminados / fusionados
A veces, es posible que deba especificar valores predeterminados para los atributos o fusionar valores adicionales en algunos de los atributos del componente. Para lograr esto, puede usar el atributo bag’s merge
método:
<div {{ $attributes->merge(['class' => 'alert alert-'.$type]) }}> {{ $message }} </div>
Si asumimos que este componente se utiliza así:
<x-alert type="error" :message="$message" class="mb-4"/>
El HTML renderizado final del componente tendrá el siguiente aspecto:
<div class="alert alert-error mb-4"> <!-- Contents of the $message variable --> </div>
Fusión de atributos que no pertenecen a clases
Al fusionar atributos que no son class
atributos, los valores proporcionados a la merge
El método se considerará los valores “predeterminados” del atributo que el consumidor del componente puede sobrescribir. diferente a class
atributos, los atributos que no son de clase no se añaden entre sí. Por ejemplo, un button
El componente puede tener el siguiente aspecto:
<button {{ $attributes->merge(['type' => 'button']) }}> {{ $slot }} </button>
Para renderizar el componente de botón con un personalizado type
, se puede especificar al consumir el componente. Si no se especifica ningún tipo, el button
se utilizará el tipo:
<x-button type="submit"> Submit </x-button>
El HTML renderizado del button
componente en este ejemplo sería:
<button type="submit"> Submit </button>
Si desea un atributo que no sea class
para tener sus valores adjuntos, puede utilizar el prepends
método:
<div {{ $attributes->merge(['data-controller' => $attributes->prepends('profile-controller')]) }}> {{ $slot }} </div>
Atributos de filtrado
Puede filtrar atributos usando el filter
método. Este método acepta un cierre que debería devolver true
si desea conservar el atributo en la bolsa de atributos:
{{ $attributes->filter(fn ($value, $key) => $key == 'foo') }}
Por conveniencia, puede utilizar el whereStartsWith
método para recuperar todos los atributos cuyas claves comienzan con una cadena determinada:
{{ $attributes->whereStartsWith('wire:model') }}
Utilizando el first
método, puede representar el primer atributo en una bolsa de atributos determinada:
{{ $attributes->whereStartsWith('wire:model')->first() }}
Ranuras
A menudo, necesitará pasar contenido adicional a su componente a través de “ranuras”. Imaginemos que un alert
El componente que creamos tiene el siguiente marcado:
<!-- /resources/views/components/alert.blade.php --> <div class="alert alert-danger"> {{ $slot }} </div>
Podemos pasar contenido al slot
inyectando contenido en el componente:
<x-alert> <strong>Whoops!</strong> Something went wrong! </x-alert>
A veces, un componente puede necesitar renderizar múltiples ranuras diferentes en diferentes ubicaciones dentro del componente. Modifiquemos nuestro componente de alerta para permitir la inyección de un “título”:
<!-- /resources/views/components/alert.blade.php --> <span class="alert-title">{{ $title }}</span> <div class="alert alert-danger"> {{ $slot }} </div>
Puede definir el contenido de la ranura nombrada usando el x-slot
etiqueta. Cualquier contenido que no esté dentro de un x-slot
se pasará al componente en el $slot
variable:
<x-alert> <x-slot name="title"> Server Error </x-slot> <strong>Whoops!</strong> Something went wrong! </x-alert>
Ranuras con ámbito
Si ha utilizado un marco de JavaScript como Vue, es posible que esté familiarizado con las “ranuras con alcance”, que le permiten acceder a datos o métodos desde el componente dentro de su ranura. Puede lograr un comportamiento similar en Laravel definiendo métodos públicos o propiedades en su componente y accediendo al componente dentro de su ranura a través del $component
variable:
<x-alert> <x-slot name="title"> {{ $component->formatAlert('Server Error') }} </x-slot> <strong>Whoops!</strong> Something went wrong! </x-alert>
Vistas de componentes en línea
Para componentes muy pequeños, puede resultar engorroso administrar tanto la clase de componente como la plantilla de vista del componente. Por esta razón, puede devolver el marcado del componente directamente desde el render
método:
/** * Get the view / contents that represent the component. * * @return IlluminateViewView|Closure|string */ public function render() { return <<<'blade' <div class="alert alert-danger"> {{ $slot }} </div> blade; }
Generación de componentes de vista en línea
Para crear un componente que represente una vista en línea, puede usar el inline
opción al ejecutar la make:component
mando:
php artisan make:component Alert --inline
Componentes anónimos
Al igual que los componentes en línea, los componentes anónimos proporcionan un mecanismo para administrar un componente a través de un solo archivo. Sin embargo, los componentes anónimos utilizan un archivo de vista única y no tienen una clase asociada. Para definir un componente anónimo, solo necesita colocar una plantilla Blade dentro de su resources/views/components
directorio. Por ejemplo, suponiendo que haya definido un componente en resources/views/components/alert.blade.php
:
<x-alert/>
Puede utilizar el .
carácter para indicar si un componente está anidado más profundamente dentro del components
directorio. Por ejemplo, suponiendo que el componente se define en resources/views/components/inputs/button.blade.php
, puedes renderizarlo así:
<x-inputs.button/>
Propiedades / atributos de datos
Dado que los componentes anónimos no tienen ninguna clase asociada, es posible que se pregunte cómo puede diferenciar qué datos deben pasarse al componente como variables y qué atributos deben colocarse en la bolsa de atributos del componente.
Puede especificar qué atributos deben considerarse variables de datos utilizando el @props
directiva en la parte superior de la plantilla Blade de su componente. Todos los demás atributos del componente estarán disponibles a través de la bolsa de atributos del componente. Si desea dar un valor predeterminado a una variable de datos, puede especificar el nombre de la variable como clave de matriz y el valor predeterminado como valor de matriz:
<!-- /resources/views/components/alert.blade.php --> @props(['type' => 'info', 'message']) <div {{ $attributes->merge(['class' => 'alert alert-'.$type]) }}> {{ $message }} </div>
Componentes dinámicos
A veces, es posible que necesite renderizar un componente pero no saber qué componente debe renderizarse hasta el tiempo de ejecución. En esta situación, puede utilizar la función integrada de Laravel dynamic-component
componente para representar el componente en función de un valor de tiempo de ejecución o una variable:
<x-dynamic-component :component="$componentName" class="mt-4" />
Incluyendo subvistas
Blade’s @include
La directiva le permite incluir una vista Blade desde dentro de otra vista. Todas las variables que están disponibles para la vista principal estarán disponibles para la vista incluida:
<div> @include('shared.errors') <form> <!-- Form Contents --> </form> </div>
Aunque la vista incluida heredará todos los datos disponibles en la vista principal, también puede pasar una matriz de datos adicionales a la vista incluida:
@include('view.name', ['some' => 'data'])
Si intentas @include
una vista que no existe, Laravel arrojará un error. Si desea incluir una vista que puede estar presente o no, debe usar la @includeIf
directiva:
@includeIf('view.name', ['some' => 'data'])
Si a ti te gustaría @include
una vista si una expresión booleana dada se evalúa como true
, puede utilizar el @includeWhen
directiva:
@includeWhen($boolean, 'view.name', ['some' => 'data'])
Si a ti te gustaría @include
una vista si una expresión booleana dada se evalúa como false
, puede utilizar el @includeUnless
directiva:
@includeUnless($boolean, 'view.name', ['some' => 'data'])
Para incluir la primera vista que existe desde una determinada matriz de vistas, puede utilizar la includeFirst
directiva:
@includeFirst(['custom.admin', 'admin'], ['some' => 'data'])
Debe evitar usar el
__DIR__
y__FILE__
constantes en sus vistas Blade, ya que se referirán a la ubicación de la vista compilada en caché.
Aliasing incluye
Si las inclusiones de Blade están almacenadas en un subdirectorio, es posible que desee asignarles un alias para facilitar el acceso. Por ejemplo, imagina una inclusión Blade almacenada en resources/views/includes/input.blade.php
con el siguiente contenido:
<input type="{{ $type ?? 'text' }}">
Puede utilizar el include
método para alias de la inclusión de includes.input
para input
. Normalmente, esto debe hacerse en el boot
método de tu AppServiceProvider
:
use IlluminateSupportFacadesBlade; Blade::include('includes.input', 'input');
Una vez que se ha asignado un alias a la inclusión, puede renderizarla usando el nombre de alias como la directiva Blade:
@input(['type' => 'email'])
Representación de vistas para colecciones
Puede combinar bucles e incluye en una línea con Blade’s @each
directiva:
@each('view.name', $jobs, 'job')
El primer argumento es la vista parcial a representar para cada elemento de la matriz o colección. El segundo argumento es la matriz o colección sobre la que desea iterar, mientras que el tercer argumento es el nombre de la variable que se asignará a la iteración actual dentro de la vista. Entonces, por ejemplo, si está iterando sobre una matriz de jobs
, normalmente querrá acceder a cada trabajo como un job
variable dentro de su vista parcial. La clave para la iteración actual estará disponible como key
variable dentro de su vista parcial.
También puede pasar un cuarto argumento al @each
directiva. Este argumento determina la vista que se renderizará si la matriz dada está vacía.
@each('view.name', $jobs, 'job', 'view.empty')
Vistas renderizadas a través de
@each
no herede las variables de la vista principal. Si la vista secundaria requiere estas variables, debe usar@foreach
y@include
en lugar de.
Pilas
Blade le permite empujar a pilas con nombre que se pueden renderizar en otro lugar en otra vista o diseño. Esto puede ser particularmente útil para especificar cualquier biblioteca de JavaScript requerida por sus vistas secundarias:
@push('scripts') <script src="/example.js"></script> @endpush
Puede empujar a una pila tantas veces como sea necesario. Para representar el contenido completo de la pila, pase el nombre de la pila al @stack
directiva:
<head> <!-- Head Contents --> @stack('scripts') </head>
Si desea anteponer el contenido al comienzo de una pila, debe usar la @prepend
directiva:
@push('scripts') This will be second... @endpush // Later... @prepend('scripts') This will be first... @endprepend
Inyección de servicio
los @inject
La directiva se puede usar para recuperar un servicio del contenedor de servicios de Laravel. El primer argumento pasado a @inject
es el nombre de la variable en la que se colocará el servicio, mientras que el segundo argumento es el nombre de la clase o interfaz del servicio que desea resolver:
@inject('metrics', 'AppServicesMetricsService') <div> Monthly Revenue: {{ $metrics->monthlyRevenue() }}. </div>
Hoja extensible
Blade le permite definir sus propias directivas personalizadas utilizando el directive
método. Cuando el compilador Blade encuentra la directiva personalizada, llamará a la devolución de llamada proporcionada con la expresión que contiene la directiva.
El siguiente ejemplo crea un @datetime($var)
directiva que formatea un determinado $var
, que debería ser una instancia de DateTime
:
<?php
namespace AppProviders;
use IlluminateSupportFacadesBlade;
use IlluminateSupportServiceProvider;
class AppServiceProvider extends ServiceProvider
{
/**
* Register any application services.
*
* @return void
*/
public function register()
{
//
}
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
Blade::directive('datetime', function ($expression) {
return "<?php echo ($expression)->format('m/d/Y H:i'); ?>";
});
}
}
Como puede ver, encadenaremos el format
método en cualquier expresión que se pase a la directiva. Entonces, en este ejemplo, el PHP final generado por esta directiva será:
<?php echo ($var)->format('m/d/Y H:i'); ?>
Después de actualizar la lógica de una directiva Blade, deberá eliminar todas las vistas Blade almacenadas en caché. Las vistas de Blade almacenadas en caché se pueden eliminar utilizando el
view:clear
Mando artesanal.
Declaraciones If personalizadas
La programación de una directiva personalizada es a veces más compleja de lo necesario al definir declaraciones condicionales personalizadas simples. Por esa razón, Blade proporciona una Blade::if
método que le permite definir rápidamente directivas condicionales personalizadas utilizando Closures. Por ejemplo, definamos un condicional personalizado que verifique el proveedor de la nube de aplicaciones actual. Podemos hacer esto en el boot
método de nuestro AppServiceProvider
:
use IlluminateSupportFacadesBlade; /** * Bootstrap any application services. * * @return void */ public function boot() { Blade::if('cloud', function ($provider) { return config('filesystems.default') === $provider; }); }
Una vez que se ha definido el condicional personalizado, podemos usarlo fácilmente en nuestras plantillas:
@cloud('digitalocean') // The application is using the digitalocean cloud provider... @elsecloud('aws') // The application is using the aws provider... @else // The application is not using the digitalocean or aws environment... @endcloud @unlesscloud('aws') // The application is not using the aws environment... @endcloud