Plantillas de Blade
Última actualización
¿Te fue útil?
Última actualización
¿Te fue útil?
Blade es el simple, pero potente motor de plantillas que se incluye con Laravel. A diferencia de otros motores de plantillas PHP, Blade no restringe el uso de código PHP plano en las plantillas. De hecho, todas las plantillas Blade se compilan en código PHP plano y se almacenan en caché hasta que se modifican, lo que significa que Blade añade esencialmente cero sobrecarga a su aplicación. Los archivos de plantilla de Blade utilizan la extensión de archivo .blade.php
y normalmente se almacenan en el directorio resources/views
.
Las vistas Blade pueden ser devueltas desde rutas o controladores utilizando el helper global view
. Por supuesto, como se menciona en la documentación sobre , se pueden pasar datos a la vista Blade utilizando el segundo argumento del helper view
:
¿Quieres llevar tus plantillas Blade al siguiente nivel y construir interfaces dinámicas con facilidad? Echa un vistazo a . Livewire le permite escribir componentes Blade que se aumentan con la funcionalidad dinámica que normalmente sólo sería posible a través de frameworks frontend como React o Vue, proporcionando un gran enfoque para la construcción de frontends modernos y reactivos sin las complejidades, renderización del lado del cliente, o pasos de construcción de muchos frameworks JavaScript.
Puede mostrar los datos que se pasan a sus vistas Blade envolviendo la variable entre llaves. Por ejemplo, dada la siguiente ruta:
Puede mostrar el contenido de la variable nombre
de la siguiente manera:
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 PHP. De hecho, puede poner cualquier código PHP que desee dentro de una sentencia Blade echo:
Por defecto, Blade (y el helper e
de Laravel) codificarán doblemente las entidades HTML. Si quieres desactivar la doble codificación, llama al método Blade::withoutDoubleEncoding
desde el método boot
de tu AppServiceProvider
:
Por defecto, las sentencias Blade {{ }}
se envían automáticamente a través de la función htmlspecialchars
de PHP para evitar ataques XSS. Si no desea que sus datos sean escapados, puede utilizar la siguiente sintaxis:
Dado que muchos frameworks de JavaScript también utilizan llaves "curly" para indicar que una determinada expresión debe mostrarse en el navegador, puede utilizar el símbolo @
para informar al motor de renderizado de Blade de que una expresión debe permanecer intacta. Por ejemplo
En este ejemplo, el símbolo @
será eliminado por Blade; sin embargo, la expresión {{ nombre }}
permanecerá intacta por el motor de Blade, permitiendo que sea renderizada por su framework JavaScript.
El símbolo @
también puede utilizarse para escapar de las directivas Blade:
A veces puedes pasar un array a tu vista con la intención de renderizarlo como JSON para inicializar una variable JavaScript. Por ejemplo:
Sin embargo, en lugar de llamar manualmente a json_encode
, puede utilizar la directiva del método Illuminate\Support\Js::from
. El método from
acepta los mismos argumentos que la función json_encode
de PHP; sin embargo, se asegurará de que el JSON resultante se escapa correctamente para su inclusión entre comillas HTML. El método from
devolverá una sentencia JavaScript JSON.parse
que convertirá el objeto o arreglo dado en un objeto JavaScript válido:
Las últimas versiones del esqueleto de aplicaciones Laravel incluyen una fachada Js
, que proporciona un cómodo acceso a esta funcionalidad dentro de tus plantillas Blade:
@verbatim
Si está mostrando variables JavaScript en una gran parte de su plantilla, puede envolver el HTML en la directiva @verbatim
para no tener que prefijar cada sentencia Blade echo con un símbolo @
:
Además de la herencia de plantillas y la visualización de datos, Blade también proporciona cómodos atajos para estructuras de control PHP comunes, como sentencias condicionales y bucles. Estos atajos proporcionan una forma muy limpia y concisa de trabajar con las estructuras de control de PHP sin dejar de ser familiar a sus homólogos de PHP.
Puede construir sentencias if
utilizando las directivas @if
, @elseif
, @else
y @endif
. Estas directivas funcionan de forma idéntica a sus equivalentes en PHP:
Para mayor comodidad, Blade también proporciona una directiva @unless
:
Además de las directivas condicionales ya discutidas, las directivas @isset
y @empty
pueden ser usadas como convenientes atajos para sus respectivas funciones PHP:
Si es necesario, puede especificar la guardia de autenticación que debe comprobarse al utilizar las directivas @auth
y @guest
:
Puede comprobar si la aplicación se está ejecutando en el entorno de producción utilizando la directiva @production
:
O bien, puede determinar si la aplicación se está ejecutando en un entorno específico utilizando la directiva @env
:
Puede determinar si una sección de la herencia de la plantilla tiene contenido utilizando la directiva @hasSection
:
Puede utilizar la directiva sectionMissing
para determinar si una sección no tiene contenido:
Las sentencias switch pueden construirse utilizando las directivas @switch
, @case
, @break
, @default
y @endswitch
:
Además de las sentencias condicionales, Blade proporciona directivas simples para trabajar con las estructuras de bucle de PHP. De nuevo, cada una de estas directivas funciona de forma idéntica a sus equivalentes en PHP:
Cuando se utilizan bucles también se puede saltar la iteración actual o finalizar el bucle utilizando las directivas @continue
y @break
:
También puede incluir la condición de continuación o ruptura dentro de la declaración de directiva:
Mientras se itera a través de un bucle foreach
, una variable $loop
estará disponible dentro de tu bucle. Esta variable proporciona acceso a información útil como el índice actual del bucle y si es la primera o la última iteración del bucle:
Si estás en un bucle anidado, puedes acceder a la variable $loop
del bucle padre a través de la propiedad parent
:
La variable $loop
también contiene otras propiedades útiles:
$loop->index
El índice de la iteración actual del bucle (comienza en 0).
$loop->iteration
La iteración actual del bucle (comienza en 1).
$loop->remaining
Las iteraciones restantes en el bucle.
$loop->count
El número total de elementos de la matriz que se está iterando.
$loop->first
Si esta es la primera iteración a través del bucle.
$loop->last
Si esta es la última iteración a través del bucle.
$loop->even
Si se trata de una iteración par a través del bucle.
$loop->odd
Si se trata de una iteración impar a través del bucle.
$loop->depth
El nivel de anidamiento del bucle actual.
$loop->parent
En un bucle anidado, la variable del bucle padre.
La directiva @class
compila condicionalmente una cadena de clases CSS. La directiva acepta un array de clases donde la clave del array contiene la clase o clases que desea añadir, mientras que el valor es una expresión booleana. Si el elemento del array tiene una clave numérica, siempre se incluirá en la lista de clases renderizada:
Del mismo modo, la directiva @style
puede utilizarse para añadir condicionalmente estilos CSS en línea a un elemento HTML:
Por comodidad, puede utilizar la directiva @checked
para indicar fácilmente si una casilla de verificación HTML está "marcada". Esta directiva se hará eco de checked
si la condición proporcionada se evalúa como true
:
Del mismo modo, la directiva @selected
puede utilizarse para indicar si una determinada opción de selección debe ser "seleccionada":
Además, la directiva @disabled
puede utilizarse para indicar si un elemento determinado debe estar "desactivado":
Además, la directiva @readonly
puede utilizarse para indicar si un elemento dado debe ser "readonly":
Además, la directiva @required
puede utilizarse para indicar si un elemento determinado debe ser "obligatorio":
La directiva @include
de Blade permite incluir una vista Blade dentro de otra vista. Todas las variables disponibles para la vista padre estarán disponibles para la vista incluida:
Aunque la vista incluida heredará todos los datos disponibles en la vista padre, también puede pasar una matriz de datos adicionales que deben estar disponibles para la vista incluida:
Si intentas @include
una vista que no existe, Laravel arrojará un error. Si deseas incluir una vista que puede o no estar presente, debes utilizar la directiva @includeIf
:
Si desea @incluir
una vista si una expresión booleana dada se evalúa como true
o false
, puede utilizar las directivas @includeWhen
e @includeUnless
:
Para incluir la primera vista que exista de un conjunto dado de vistas, puede utilizar la directiva includeFirst
:
Puede combinar bucles e includes en una línea con la directiva @each
de Blade:
El primer argumento de la directiva @each
es la vista que se mostrará para cada elemento del array o colección. El segundo argumento es la matriz o colección sobre la que se 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. Así, por ejemplo, si estás iterando sobre un array de jobs
, normalmente querrás acceder a cada job como una variable job
dentro de la vista. La clave del array para la iteración actual estará disponible como la variable key
dentro de la vista.
También puede pasar un cuarto argumento a la directiva @each
. Este argumento determina la vista que se mostrará si la matriz dada está vacía.
@once
La directiva @once
permite definir una parte de la plantilla que sólo se evaluará una vez por ciclo de renderizado. Esto puede ser útil para empujar una determinada pieza de JavaScript en el header de la página usando stacks. Por ejemplo, si está renderizando un componente determinado dentro de un bucle, puede que desee enviar el JavaScript a la cabecera sólo la primera vez que se renderice el componente:
Dado que la directiva @once
se utiliza a menudo junto con las directivas @push
o @prepend
, las directivas @pushOnce
y @prependOnce
están disponibles para su comodidad:
En algunas situaciones, es útil incrustar código PHP en las vistas. Puedes usar la directiva Blade @php
para ejecutar un bloque de PHP plano dentro de tu plantilla:
Si sólo necesita escribir una única sentencia PHP, puede incluir la sentencia dentro de la directiva @php
:
Blade también permite definir comentarios en las vistas. Sin embargo, a diferencia de los comentarios HTML, los comentarios de Blade no se incluyen en el HTML devuelto por su aplicación:
Los componentes y las ranuras proporcionan ventajas similares a las de las secciones, los diseños y los includes; sin embargo, algunos pueden encontrar el modelo mental de los componentes y las ranuras más fácil de entender. Existen dos enfoques para escribir componentes: componentes basados en clases y componentes anónimos.
Para crear un componente basado en una clase, puede utilizar el comando Artisan make:component
. Para ilustrar el uso de componentes, crearemos un simple componente Alert
. El comando make:component
colocará el componente en el directorio app/View/Components
:
El comando make:component
también creará una plantilla de vista para el componente. La vista se colocará en el directorio resources/views/components
. Cuando escribes componentes para tu propia aplicación, los componentes se descubren automáticamente en el directorio app/View/Components
y en el directorio resources/views/components
, por lo que normalmente no es necesario registrar más componentes.
También puede crear componentes dentro de subdirectorios:
El comando anterior creará un componente Input
en el directorio app/View/Components/Forms
y la vista se colocará en el directorio resources/views/components/forms
.
Si desea crear un componente anónimo (un componente con sólo una plantilla Blade y sin clase), puede utilizar la bandera --view
al invocar el comando make:component
:
El comando anterior creará un archivo Blade en resources/views/components/forms/input.blade.php
que puede ser renderizado como un componente a través de <x-forms.input />
.
Al escribir componentes para su propia aplicación, los componentes se descubren automáticamente en el directorio app/View/Components
y en el directorio resources/views/components
.
Sin embargo, si está creando un paquete que utiliza componentes Blade, tendrá que registrar manualmente su clase de componente y su alias de etiqueta HTML. Normalmente debe registrar sus componentes en el método boot
del proveedor de servicios de su paquete:
Una vez registrado el componente, puede renderizarse utilizando su alias de etiqueta:
Alternativamente, puede utilizar el método componentNamespace
para autocargar clases de componentes por convención. Por ejemplo, un paquete Nightshade
puede tener componentes Calendar
y ColorPicker
que residen dentro del espacio de nombres Package\Views\Components
:
Esto permitirá el uso de componentes de paquete por su espacio de nombres de proveedor utilizando la sintaxis nombre-paquete::
:
Blade detectará automáticamente la clase vinculada a este componente escribiendo el nombre del componente en pascal. También se admiten subdirectorios utilizando la notación "punto".
Para mostrar un componente, puede utilizar una etiqueta de componente Blade dentro de una de sus plantillas Blade. Las etiquetas de componente Blade comienzan con la cadena x-
seguida del nombre en mayúsculas y minúsculas de la clase de componente:
Si la clase del componente está anidada a mayor profundidad dentro del directorio app/View/Components
, puede utilizar el carácter .
para indicar la anidación de directorios. Por ejemplo, si asumimos que un componente está localizado en app/View/Components/Inputs/Button.php
, podemos renderizarlo así:
Si desea renderizar condicionalmente su componente, puede definir un método shouldRender
en su clase componente. Si el método shouldRender
devuelve false
el componente no será renderizado:
Puede pasar datos a los componentes Blade utilizando atributos HTML. Los valores primitivos codificados pueden pasarse al componente mediante cadenas de atributos HTML simples. Las expresiones y variables PHP deben pasarse al componente mediante atributos que utilicen el carácter :
como prefijo:
Debe definir todos los atributos de datos del componente en su constructor de clase. 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 método render
del componente:
Cuando su componente es renderizado, puede mostrar el contenido de las variables públicas de su componente haciendo eco de las variables por su nombre:
Los argumentos de los constructores de componentes deben especificarse utilizando camelCase
, mientras que kebab-case
debe utilizarse cuando se haga referencia a los nombres de los argumentos en los atributos HTML. Por ejemplo, dado el siguiente constructor de componente:
El argumento $alertType
puede proporcionarse al componente del siguiente modo:
Al pasar atributos a los componentes, también puede utilizar una sintaxis de "atributo corto". Esto suele ser conveniente, ya que los nombres de los atributos suelen coincidir con los nombres de las variables a las que corresponden:
Dado que algunos frameworks JavaScript como Alpine.js también utilizan atributos con prefijo de dos puntos, puede utilizar un prefijo de dos puntos dobles (::
) para informar a Blade de que el atributo no es una expresión PHP. Por ejemplo, dado el siguiente componente:
El siguiente HTML será renderizado por Blade:
Además de que las variables públicas estén disponibles para su plantilla de componentes, cualquier método público del componente puede ser invocado. Por ejemplo, imagine un componente que tiene un método isSelected
:
Puede ejecutar este método desde su plantilla de componentes invocando la variable que coincida con el nombre del método:
Los componentes Blade también le permiten acceder al nombre del componente, atributos y slot dentro del método render de la clase. Sin embargo, para acceder a estos datos, debe devolver un closure desde el método render
de su componente. El closure recibirá un array $data
como único argumento. Este array contendrá varios elementos que proporcionan información sobre el componente:
El componentName
es igual al nombre utilizado en la etiqueta HTML después del prefijo x-
. Así, el componentName
de <x-alert />
será alert
. El elemento attributes
contendrá todos los atributos presentes en la etiqueta HTML. El elemento slot
es una instancia de Illuminate\Support\HtmlString
con el contenido de la ranura del componente.
El closure debe devolver una cadena. Si la cadena devuelta corresponde a una vista existente, esa vista se renderizará; en caso contrario, la cadena devuelta se evaluará como una vista Blade en línea.
Si desea evitar que algunos métodos públicos o propiedades sean expuestos como variables a su plantilla de componentes, puede añadirlos a una propiedad $except
array en su componente:
Ya hemos examinado cómo pasar atributos de datos a un componente; sin embargo, a veces puede ser necesario especificar atributos HTML adicionales, como class
, que no forman parte de los datos necesarios para que funcione un componente. Normalmente, estos atributos adicionales se pasan al elemento raíz de la plantilla del componente. Por ejemplo, imaginemos que queremos mostrar un componente alert
de la siguiente manera:
Todos los atributos que no formen parte del constructor del componente se añadirá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 de la variable $attributes
. Todos los atributos se pueden mostrar dentro del componente haciendo eco de esta variable:
A veces puede ser necesario especificar valores por defecto para los atributos o combinar valores adicionales en algunos de los atributos del componente. Para ello, puede utilizar el método merge
de la bolsa de atributos. Este método es especialmente útil para definir un conjunto de clases CSS predeterminadas que deben aplicarse siempre a un componente:
Si suponemos que este componente se utiliza así:
El HTML final renderizado del componente tendrá el siguiente aspecto:
A veces es posible que desee combinar clases si una condición dada es true
. Puede hacerlo mediante el método class
, que acepta un array de clases donde la clave del array contiene la clase o clases que desea añadir, mientras que el valor es una expresión booleana. Si el elemento del array tiene una clave numérica, siempre se incluirá en la lista de clases generada:
Si necesita combinar otros atributos en su componente, puede encadenar el método merge
en el método class
:
Al fusionar atributos que no son atributos class
, los valores proporcionados al método merge
se considerarán los valores "por defecto" del atributo. Sin embargo, a diferencia del atributo class
, estos atributos no se fusionarán con valores de atributo inyectados. En su lugar, se sobrescribirán. Por ejemplo, la implementación de un componente button
puede tener el siguiente aspecto:
Para renderizar el componente button con un type
personalizado, se puede especificar al consumir el componente. Si no se especifica ningún tipo, se utilizará el tipo button
:
El HTML renderizado del componente button
en este ejemplo sería:
Si desea que un atributo distinto de class
tenga su valor por defecto y los valores inyectados unidos, puede utilizar el método prepends
. En este ejemplo, el atributo data-controller
comenzará siempre con profile-controller
y cualquier valor adicional inyectado de data-controller
se colocará después de este valor por defecto:
Puedes filtrar atributos utilizando el método filter
. Este método acepta un closure que debe devolver true
si deseas mantener el atributo en la bolsa de atributos:
Para mayor comodidad, puede utilizar el método whereStartsWith
para recuperar todos los atributos cuyas claves empiecen por una cadena determinada:
Por el contrario, el método whereDoesntStartWith
puede utilizarse para excluir todos los atributos cuyas claves empiecen por una cadena determinada:
Utilizando el método first
, puedes renderizar el primer atributo de una bolsa de atributos dada:
Si desea comprobar si un atributo está presente en el componente, puede utilizar el método has
. Este método acepta el nombre del atributo como único argumento y devuelve un booleano que indica si el atributo está presente o no:
Puede recuperar el valor de un atributo específico utilizando el método get
:
Por defecto, algunas palabras clave están reservadas para el uso interno de Blade con el fin de renderizar componentes. Las siguientes palabras clave no se pueden definir como propiedades públicas o nombres de métodos dentro de sus componentes:
data
render
resolveView
shouldRender
view
withAttributes
withName
A menudo necesitará pasar contenido adicional a su componente a través de "slots". Los "slots" de los componentes se renderizan haciendo eco de la variable $slot
. Para explorar este concepto, imaginemos que un componente alert
tiene el siguiente marcado:
Podemos pasar contenido al “slot" inyectando contenido en el componente:
A veces, un componente puede necesitar mostrar varias ranuras diferentes en distintas ubicaciones dentro del componente. Modifiquemos nuestro componente de alerta para permitir la inyección de una ranura de "título":
Puede definir el contenido de la ranura con la etiqueta x-slot
. Cualquier contenido que no esté dentro de una etiqueta x-slot
explícita se pasará al componente en la variable $slot
:
Si has utilizado un framework JavaScript como Vue, puede que estés familiarizado con los "scoped slots", que te permiten acceder a datos o métodos del componente dentro de tu slot. Puedes conseguir un comportamiento similar en Laravel definiendo métodos públicos o propiedades en tu componente y accediendo al componente dentro de tu slot a través de la variable $component
. En este ejemplo, asumiremos que el componente x-alert
tiene un método público formatAlert
definido en su clase componente:
Al igual que los componentes Blade, puede asignar atributos adicionales a las ranuras, como nombres de clases CSS:
Para interactuar con los atributos de la ranura, puede acceder a la propiedad attributes
de la variable de la ranura. Para obtener más información sobre cómo interactuar con los atributos, consulte la documentación sobre atributos de los componentes:
Para componentes muy pequeños, puede resultar engorroso gestionar tanto la clase del componente como la plantilla de vista del componente. Por esta razón, puede devolver el marcado del componente directamente desde el método render
:
Para crear un componente que muestre una vista en línea, puede utilizar la opción inline
al ejecutar el comando make:component
:
A veces puede necesitar renderizar un componente pero no saber qué componente debe ser renderizado hasta el tiempo de ejecución. En esta situación, puede utilizar el componente dynamic-component
incorporado de Laravel para renderizar el componente basado en un valor o variable en tiempo de ejecución:
Al escribir componentes para su propia aplicación, los componentes se descubren automáticamente en el directorio app/View/Components
y en el directorio resources/views/components
.
Sin embargo, si estás construyendo un paquete que utiliza componentes Blade o colocando componentes en directorios no convencionales, necesitarás registrar manualmente tu clase de componente y su alias de etiqueta HTML para que Laravel sepa dónde encontrar el componente. Normalmente deberías registrar tus componentes en el método boot
del proveedor de servicios de tu paquete:
Una vez registrado el componente, puede renderizarse utilizando su alias de etiqueta:
Alternativamente, puede utilizar el método componentNamespace
para autocargar clases de componentes por convención. Por ejemplo, un paquete Nightshade
puede tener componentes Calendar
y ColorPicker
que residen dentro del espacio de nombres Package\Views\Components
:
Esto permitirá el uso de componentes de paquete por su espacio de nombres de proveedor utilizando la sintaxis nombre-paquete::
:
Blade detectará automáticamente la clase vinculada a este componente escribiendo el nombre del componente en pascal. También se admiten subdirectorios utilizando la notación "punto".
Las directivas @auth
y @guest
pueden utilizarse para determinar rápidamente si el usuario actual está o es un invitado:
Si tu componente requiere dependencias del , puedes listarlas antes de cualquiera de los atributos de datos del componente y serán automáticamente inyectadas por el contenedor: