Sintaxis de plantillas v2
Las plantillas v2 son la sintaxis de plantillas recomendada en Zittme. Suma funciones propias de Zittme a las directivas estilo Blade y es compatible con la sintaxis v1 dentro del mismo archivo.
Declaración de versión
- Archivos
.html:@version(2)en la primera línea (o<config version="2" />) - Archivos
.blade.php: v2 automáticamente (tu IDE puede resaltar la sintaxis)
@version(2)
<div class="my-skin">
<h1>{{ $title }}</h1>
</div>Salida
| Sintaxis | Significado |
|---|---|
{{ $var }} | Imprime con escape HTML (predeterminado) |
{!! $var !!} | Imprime tal cual, sin escape |
{$var} | Salida compatible con v1 |
Usa {!! !!} solo con HTML que el núcleo ya sanitizó, como el cuerpo del editor. Si imprimes la entrada del usuario tal cual, abres la puerta a XSS. El escape reconoce el contexto (HTML/JS) y se aplica automáticamente.
Filtros
Puedes encadenar |filtro a la salida, y conectar varios.
{{ $title|upper }}
{{ $timestamp|date:'Y-m-d' }}
{{ $price|number_format }}
{{ $tags|join:', ' }}Filtros principales: autoescape escape noescape escapejs json strip_tags trim urlencode lower upper nl2br join:separator date:format number_format:decimals number_shorten link
Condiciones
@if ($is_logged)
...
@elseif ($guest_allowed)
...
@else
...
@endifTambién hay directivas de condición específicas.
| Directiva | Significado |
|---|---|
@isset($var) ~ @endisset | Si la variable existe |
@empty($var) ~ @endempty | Si está vacía |
@admin ~ @endadmin | Si es el administrador principal |
@auth ~ @endauth | Si hay sesión iniciada (@auth('manager') es permiso de administración) |
@guest ~ @endguest | Si no hay sesión iniciada |
@can('view') ~ @endcan | Si tiene ese permiso (también se admiten @cannot y @canany([...])) |
@desktop / @mobile | Distinción por dispositivo |
Bucles
@foreach ($list as $key => $item)
<li>{{ $item->title }}</li>
@endforeach
@forelse ($list as $item)
<li>{{ $item->title }}</li>
@empty
<li>항목이 없습니다</li>
@endforelseTambién se admiten @for @while @switch/@case/@break/@default @continue.
Dentro de un bucle puedes usar la variable $loop: $loop->index (desde 0) $loop->iteration (desde 1) $loop->count $loop->first $loop->last $loop->even $loop->odd $loop->depth $loop->parent
@foreach ($list as $item)
<li class="@if ($loop->first) is-first @endif">{{ $loop->iteration }}. {{ $item->title }}</li>
@endforeachAyudantes de atributos HTML
<div @class(['base', 'is-on' => $active, 'is-mine' => $item->mine])>...</div>
<div @style(['color: red', 'display: none' => $hidden])>...</div>
<input type="checkbox" @checked($is_checked) />
<option value="1" @selected($val == 1)>하나</option>
<input @disabled($locked) @readonly($readonly) @required($must) />La notación v1 checked="checked"|cond="..." sigue funcionando.
Código PHP
@php
$count = count($list);
$first = $count ? reset($list) : null;
@endphp
{@ $total = $count + 1; }- Las variables de plantilla son, por defecto, un estado compartido que hace referencia a Context. Si les antepones una barra invertida, como
\$var, se vuelven variables locales solo de esa plantilla. En los parámetros de closures y en los enlacesusetambién se usa\$. - Dentro de
{@ ... }también puedes abrir y cerrar bloques con el estiloforeach (...):/endforeach;.
Comentarios
{{-- 템플릿 주석: 출력에서 제거됩니다 --}}
<!--// v1 스타일 주석: 역시 제거됩니다 -->
<!-- 일반 HTML 주석: 출력에 남습니다 -->Atención: escribe siempre los comentarios {{-- --}} en una sola línea. Si ocupan varias líneas, el parser no puede eliminarlos por completo y puede producirse un error del servidor (500). Hubo caídas reales por este problema. Para explicaciones de varias líneas, usa comentarios HTML (<!-- -->).
Incluir otras plantillas
@include('_header')
@include('sub/box')
@include('_card', ['title' => $t, 'body' => $b]) {{-- 변수 전달 --}}
<include src="_promo" if="$show_promo" /> {{-- 조건부 포함 --}}
<include src="_banner" unless="$is_admin" />- Si pasas variables, la plantilla incluida usa solo las variables recibidas en lugar de Context (funciona como un componente).
- La inclusión condicional se hace con los atributos
if/when/cond/unlessde la etiqueta<include>. - El
<include target="..." />de v1 también funciona.
Cargar recursos: @load
@load('css/skin.css')
@load('css/skin.scss', $vars) {{-- SCSS 변수 전달 --}}
@load('js/skin.js')
@load('js/lazy.js', 'body') {{-- body 끝에서 로드 --}}
@load('^/common/js/plugins/URI.js') {{-- ^ 는 사이트 루트 --}}
@load('../lang/') {{-- 언어 파일 디렉터리 --}}
@unload('foo/bar.js') {{-- 로드 취소 --}}Como argumentos adicionales puedes indicar media y orden para CSS, y head/body y orden para JS.
Generar URLs
<a href="@url('act', 'dispMemberInfo')">내 정보</a>
<a href="{{ getUrl('', 'mid', $mid, 'act', 'dispBoardWrite') }}">글쓰기</a>@url(...) y getUrl(...) hacen lo mismo. Recuerda una sola regla.
- Enlaces que solo cambian parámetros de la página actual (paginación, orden): sin primer argumento,
getUrl('page', $n) - Enlaces a otra pantalla: pasa siempre
''como primer argumento para construir desde una URL vacía. Si no, se arrastran todos los parámetros de la solicitud actual.
Si la acción tiene una ruta declarada, se genera automáticamente una dirección corta.
Otras directivas
| Directiva | Significado |
|---|---|
@csrf | Inserta el campo del token CSRF dentro del formulario |
@json($array) | Salida JSON segura para JS (reconoce el contexto automáticamente) |
@lang('key') | Imprime una cadena de idioma (@lang('module.key')) |
@use('Namespace\Class', 'Alias') | Declara un alias de clase. Después, {{ Alias::method() }} |
@widget('widget_name', $args) | Inserta un widget |
@once ~ @endonce | Se ejecuta una sola vez, incluso dentro de un bucle |
@verbatim ~ @endverbatim | En este tramo no se interpreta la sintaxis de plantillas |
@dump($var) / @dd($var) | Salida de depuración (dd se detiene después de imprimir) |
@push('name') ~ @endpush / @stack('name') | Reúne contenido y lo imprime en un solo lugar |
@error('validator_id') ~ @enderror | Muestra errores de validación del formulario |
Lo que v2 no admite
- La herencia de plantillas de Blade (
@extends@yield@section) y los slots (@slot@inject) - La etiqueta
<block>de v1 y los atributosloop/conden etiquetas arbitrarias (excepto los atributos de condición de<include>)
Los archivos existentes que necesitan la sintaxis v1 puedes dejarlos como están. Evita mezclar las dos generaciones de sintaxis en un mismo archivo.
Trampas frecuentes en la práctica
Estos puntos salen de casos reales de fallas.
- Prohibidos los comentarios
{{-- --}}de varias líneas (consulta la sección de comentarios arriba). Son una causa habitual de errores 500 del servidor. - Para llamar directamente a un método estático desde la plantilla, declara un alias con
@usey llama por el alias. Si llamas con la ruta completa del espacio de nombres dentro de un valor de atributo, la compilación puede fallar y producir enlaces rotos como%7B...%7D. Lo más seguro es pasar el valor desde el controlador conContext::set(). Context::set()sobrescribe la variable de solicitud del mismo nombre. Al leer valores de formulario en una acción proc, es más seguro leer$_POSTdirectamente.- Especificidad de los selectores CSS:
.wrap a { color: inherit }del CSS común es más fuerte que un simple.my-linknuevo. Si el color del enlace no se aplica, sube la especificidad, por ejemplo con.wrap a.my-link.