- Blade kompilerer .blade.php-maler til ren PHP og tilbyr rene direktiver for betingelser, løkker, layouter og komponenter.
- Blades stabler (@stack, @push, @prepend) lar deg sentralisere skript og stiler, og delegere det som er stablet til undervisninger.
- Miljø-, autorisasjons-, økt- og valideringsdirektiver integrerer visningene sikkert og uttrykkelig med resten av rammeverket.
- Tilpassede direktiver og hjelpere som Js::from open the door til avanserte mønstre, inkludert et hasStack-lignende direktiv.

Hvis du jobber med Laravel daglig, vil du før eller siden støte på Blade, direktivene deres, og selvfølgelig... visningsstabler og ideen om et hypotetisk hasStack-direktiv å håndtere dem bedre. Du kan ha brukt klassiske PHP-maler før, eller du kan være vant til React eller Vue, men når du virkelig forstår Blade og alt det tilbyr (inkludert stabler), er det da måten din organiserer visninger på tar et sprang fremover.
I denne artikkelen skal vi gå inn på detaljene: du vil se hvordan Den gir en svært detaljert forklaring på hvordan Blade fungerer, hva kontrolldirektiver er, hvordan oppsett, komponenter, spor, attributter, autorisasjon og miljøer er strukturert, og i den konteksten, hvordan konseptet med stabler og et hasStack-type direktiv passer inn. for å avgjøre om det finnes stablet innhold før gjengivelse. Alt med praktiske eksempler og en realistisk tilnærming designet for moderne Laravel-prosjekter.
Hva er Blade, og hvorfor er det viktig å forstå retningslinjene?
Bladet er offisiell Laravel-malmotorDet tvinger deg ikke til å slutte å bruke PHP, men det gir deg en mye renere syntaks for å blande presentasjonslogikk og HTML uten å stadig måtte åpne og lukke tagger. Hele tiden. Hver mal .blade.php Den er kompilert til ren PHP og mellomlagret i storage/framework/views, så kjøretidskostnadene er minimale.
Bladvisninger lagres vanligvis i ressurser/visninger og returneres fra ruter eller kontrollere ved hjelp av hjelperen view()Du kan sende data til denne hjelperen i et andre argument (assosiativ array, compact()osv.), og i visningen er de konsumert med syntaksen til doble nøkler for å vise escapet innhold eller med utropstegn for ikke-escapet innhold.
En stor fordel med Blade er at den tilbyr spesifikke direktiver (de ordene som begynner med @) for å håndtere betingelser, løkker, autorisasjon, skriptstabler, komponenter, spor, validering, miljøer… Alt dette gjør visningskoden mye mer lesbar og vedlikeholdbar enn en kaotisk blanding av klassisk PHP med echo og vanlig HTML.
Grunnleggende Blade-syntaks: ekko, escape og ordrett
Den vanligste operasjonen i en visning er å vise data. Med Blade, for å skrive ut innholdet i en variabel, bruker du ganske enkelt {{ }}, som internt oversettes til en echo e($variable) og derfor, Escape HTML-enheter for å forhindre XSS:
Vis escapede variabler det er så enkelt som:
{{ $name }}
Hvis du vil vise forhåndsgenerert HTML eller innhold som ikke skal escapes (for eksempel fordi du kontrollerer det og vet at det er trygt), kan du bruke syntaksen {!!! !!}som deaktiverer automatisk escape og lar nettleseren tolke det slik det er:
{!! $htmlSeguro !!}
Hvis du jobber med frontend-rammeverk som også bruker nøkler (for eksempel Vue eller et klientsidemalbibliotek), lar Blade deg «unnslippe» sin egen motor med prefikset @. På denne måten @{{ variabelJavascript }} Det vil ikke bli tolket som et Blade-uttrykk, men vil forbli i HTML-koden for å bli behandlet av nettleserens rammeverk.
Når du har store blokker der du må respektere dobbelttastene fullt ut uten at Blade berører dem, kan du omgi dem med direktivet. @verbatim … @endverbatimAlt inni vil bli stående urørt, et veldig nyttig hjelpemiddel når man integrerer komplekse frontend-maler.
Kontrollstrukturer: if, switch, looper og $loop-variabelen
Blade tilbyr et komplett spill av direktiver for flytkontroll Disse taggene pakker inn PHP-syntaksen på en mer lesbar og konsistent måte. I praksis er logikken nesten identisk, men du får klarhet og unngår overbruk av PHP-tagger i HTML-koden.
Hvis-setningene er skrevet med @if, @elseif, @else og lukke med @endifDu har også snarveier som @unless (negasjon av en betingelse), @isset for å bekrefte at en variabel er definert og @empty for å sjekke om den er tom.
For scenarier med flere mulige verdier, direktivet @bryter replikerer PHP-bryterstrukturen med @case, @break, @default og tett med @endswitch, noe som tilrettelegger for flere kondisjonsformer som er enkle å lese.
Angående løkker, har du @til, @foreach y @mens, i tillegg til @forelseDette er veldig nyttig når du vil iterere over en samling, men også trenger å håndtere tilfellet med en tom liste uten å skrive en ekstra if-setning. @forelse ... @empty ... @endforelse Du kan gjengi alternativt innhold hvis det ikke finnes elementer.
Når du reiser gjennom en @foreachBlade gjør variabelen tilgjengelig for deg $løkke, et objekt som inneholder svært nyttig informasjon om den gjeldende iterasjonen: indeks, om det er den første eller siste svingen, om indeksen er partall eller oddetall, hvor mange iterasjoner det er totalt, eller til og med tilgang til foreldreløkken i tilfelle nestede løkker som bruker $loop->parent.
Malarv, oppsett og seksjoner
I virkelige applikasjoner ønsker du ikke å gjenta overskrifter, menyer eller bunntekster i alle visninger. Med Blade kan du definere en hovedoppsett (vanligvis lagres den i) resources/views/layouts/master.blade.php) som alle sider arver. Innenfor layouten definerer du "tomme" områder med @yield og resten av den vanlige HTML-koden forblir stabil.
For å bruke det oppsettet fra en undervisning, trenger du bare å angi @extends('layouts.master') og deklarer seksjonene du vil fylle ut ved hjelp av @del y @endeseksjon. Hver @yield('nombre') mastergraden vil tilsvare en @section('nombre') i datterens øyne.
Videre direktivet @forelder Den lar deg ikke bare overskrive en seksjon, men legg til innhold over eller under det layouten definererDette er veldig nyttig i sidefelt eller blokker som du vil utvide, ikke erstatte.
Hvis du trenger å inkludere gjenbrukbare HTML-snutter uten full arv, tilbyr Blade @inkludere og en hel familie av relaterte direktiver: @includeIf, @includeWhen, @includeUnless y @includeFirstsom lar deg betinget inkludere delvisninger eller velge den første som finnes i en liste over mulige ruter.
I tilfeller der du gjentar et lite fragment for hvert element i en samling, vil direktivet @hver Den kombinerer foreach + include på én linje, og kan til og med definere en alternativ visning for tilfellet der samlingen ankommer tom.
Bladkomponenter, spor og attributter
Bladkomponenter er den naturlige utviklingen av layouter og inkluderer: de lar deg innkapsle gjenbrukbare grensesnittkomponenter (knapper, varsler, kort, skjemaer…) med sin egen logikk, egenskaper og plasser med innhold som kan injiseres utenfra, alt med en syntaks som er svært lik komponentene i moderne JS-rammeverk.
Det finnes to hovedtyper komponenter: klassebasert (ligger i app/View/Components, generert med php artisan make:component) og anonymsom bare sees i resources/views/components uten en tilknyttet klasse. I begge tilfeller gjengis de i visninger med etiketter av typen <x-alert /> o <x-forms.input />.
Klassebaserte komponenter mottar data gjennom HTML-attributter (med kebab-case i sikte og camelCase i konstruktøren), eksponeres i komponentvisningen som offentlige egenskaper og kan velge en metode shouldRender() å betinget avgjøre om de skal vises.
For fleksibelt innhold har komponentene funksjonen spilleautomaterHovedinnholdet er tilgjengelig som $slot i komponentmalen, og spilleautomater med navn er definert ved hjelp av <x-slot name="titulo">...</x-slot> Når du bruker komponenten. Innenfra kan du kalle komponentmetoder gjennom $component og til og med sjekke om et spor er tomt med $slot->isEmpty() eller om den har reelt innhold med $slot->hasActualContent().
Komponentene håndterer også elegant flere attributter som ikke samsvarer med konstruktørens egenskaper (for eksempel class, id, data-*Alt dette er gruppert i en tilgjengelig «attributtpose» med $attributessom du kan gjengi som den er eller manipulere med metoder som merge(), class(), prepend(), filter(), whereStartsWith(), has() o get().
I tillegg inkluderer Blade spesifikke direktiver for typisk HTML-form: @sjekket, @valgt, @funksjonshemmet, @readonly y @obligatorisk, som bare skriver ut det tilsvarende attributtet hvis betingelsen de mottar evalueres til sann.
Oppsett ved bruk av komponenter og klassisk arv
I moderne Laravel blir det stadig vanligere å definere appens globale layout som en Bladkomponent (for eksempel <x-layout>) i stedet for å bare bruke den klassiske arven av @extendsPå denne måten kan layouten motta spor, attributter og egenskaper akkurat som resten av komponentene.
Det typiske mønsteret innebærer å lage en komponent Layout med php artisan make:component LayoutDefiner den grunnleggende HTML-strukturen (overskrift, CSS-lenker, navigasjon, bunntekst) i malen din og bruk den. {{ $slot }} for å injisere hovedinnholdet. Eventuelt defineres et navngitt spor. title slik at hver side spesifiserer tittelen sin på en deklarativ måte.
På den annen side finnes det "klassiske" alternativet fortsatt med malarv vía @extends, @section y @yieldDette var mye brukt før komponenter ble popularisert. Du kan fortsette å blande begge tilnærmingene, bruke komponentbaserte oppsett for alt, eller holde deg til tradisjonell arv hvis prosjektet ditt allerede er satt opp på den måten.
I begge tilfeller er målet det samme: ikke gjenta HTML-skjelettet i hver visningOppretthold ett enkelt sannhetspunkt for layouten og la hver side fokusere utelukkende på sitt spesifikke innhold.
Økt, autentisering, miljø og autorisasjon i Blade
Blade integreres veldig bra med resten av rammeverket, så det er ikke begrenset til bare å gjengi HTML: det gir deg også direktiver på høyt nivå å samhandle med økten, autentiseringssystemet, appmiljøet og autorisasjonsreglene.
For autentiseringsdelen finnes det direktiver som @aut. y @gjestDisse elementene viser innholdet sitt bare hvis brukeren er henholdsvis autentisert eller en gjest. I tillegg kan du angi en bestemt vakt som et argument for å avgrense autentiseringskonteksten som brukes.
Las miljødirektiver som @production o @env('local') De lar deg tilpasse deler av visningen avhengig av det gjeldende Laravel-miljøet. Svært nyttig, for eksempel for å vise bannere, feilsøkingsspor eller skript bare i lokale eller staging-miljøer.
Angående sesjonen, direktivet @økt Det gjør det enkelt å sjekke om en nøkkel finnes i økten, og hvis den gjør det, oppgir den verdien gjennom variabelen $verdiDette løser elegant det klassiske tilfellet med lynmeldinger eller varsler.
For policy- og gate-lignende autorisasjon tilbyr Blade @kan, @kan ikke y @cananyMed dem kan du vise eller skjule knapper, lenker eller hele blokker, avhengig av om brukeren har tillatelse til en bestemt handling på en modell eller klasse. Kombinert med @guest o @authDe tillater konstruksjon av mye tryggere og tydeligere grensesnitt.
Skjemaer, validering og feilhåndtering i visninger
Når du går fra statiske visninger til skjemaer, ser du hvor praktisk Blade er. Laravel krever at du inkluderer en CSRF-token I alle former som endrer data, og for å unngå å måtte skrive det skjulte feltet manuelt, finnes direktivet @csrf, som genererer input med tilhørende token.
HTTP-metoder som PUT, PATCH eller DELETE De simuleres gjennom et skjult felt _method, og Blade stiller til rådighet for deg @metode('LEGG INN') (eller PATCH/DELETE) for å generere den automatisk i skjemaet.
Å vise valideringsfeil Direktivet finnes @feilsom er knyttet til et bestemt felt. Innenfor det har du variabelen tilgjengelig. $melding med feilteksten. Siden det faktisk er en kompilert if-setning, kan du bruke @else for å vise alternativt innhold når det ikke er noen feil.
Objektet $feil Den er alltid tilstede i visningene og grupperer alle valideringsmeldingene for den gjeldende forespørselen. Den integreres sømløst med hjelperen. old(), som lar deg "fylle ut" skjemaet på nytt med verdiene som ble sendt inn av brukeren etter en valideringsfeil, samtidig som du beholder oppføringene og viser feilene tydelig.
Ved å kombinere disse direktivene med valideringsregler i kontrollere eller skjemaforespørsler, får du en flyt av robust validering på serversiden, et supplement til kundevalidering, og mye sikrere mot ondsinnet manipulasjon.
Stabler i Blade: @stack, @push, @prepend og hasStack-konseptet
En av Blades mindre omtalte, men mest nyttige funksjoner for store prosjekter er... stablerEn stabel er i bunn og grunn en stabel med visningsfragmenter der du kan legge til innhold fra undervisninger, komponenter eller inkluderinger, og deretter gjengi alt sammen på et bestemt punkt i hovedoppsettet.
Direktivet @stack('navn') Den markerer stedet der alle fragmenter tilknyttet den stakken vil bli dumpet. Fra enhver annen visning kan du imidlertid bruke @push('navn') å sende innhold til slutten av stakken eller @prepend('navn') å plassere den i begynnelsen. Dette brukes mye for skript og spesifikke sidestiler.
Tenk deg for eksempel at du har noe slikt i layouten din i <head> og på slutten av <body>:
@stack('styles')
...
@stack('scripts')
Så, i en spesifikk visning som trenger en Ekstra JSDu kan gjøre:
@push('scripts')
<script src="/js/pagina-especifica.js"></script>
@endpush
Dette tillater oppsettet du trenger ikke å kjenne til alle skrifttyper eller stiler på hver sideDen definerer bare stablene, og det er barnevisningene som stabler det de trenger. Det finnes også @pushIf å sende innhold basert på en boolsk betingelse uten å måtte skrive hele if-setningen.
I denne sammenhengen går mange utviklere glipp av en @hasStack-typedirektiv eller lignende som ville tillate å sjekke om en gitt stabel har innhold før den gjengis. Selv om Blade ikke kommer med et direktiv som standard med det navnet, er ideen klar: å kunne gjøre noe sånt som "hvis skriptstakken er tom, ikke skriv ut flere etiketter" eller "hvis det er elementer i en metadatastabel, pakk dem inn i en bestemt blokk".
Måten å oppnå tilsvarende atferd i dag er komplementere stakkdirektiver med logikk i oppsettet eller med tilpassede hjelpere, eller til og med med våre egne registrerte direktiver via Blade::directive()På denne måten kan et hasStack-direktiv simuleres som internt spør stakken før det bestemmes hvilken HTML som skal genereres.
JSON-, JavaScript- og hjelpedirektiver i Blade
I mange Laravel-visninger må du sende data fra backend til JavaScript. Vanligvis innebærer dette å gjøre en json_encode() av en array eller samling og la den ligge inne i et innebygd skript, men det er ikke alltid trygt eller praktisk. Laravel gjør dette enklere med hjelperen Js::from(), som serialiserer og korrekt escaperer PHP-verdier til JSON for innebygging i HTML.
Når du gjengir komplekse data til nettleseren, Js::from() Den unngår problemer med anførselstegn eller spesialtegn og returnerer et uttrykk JSON.parse() Trygt å inkludere i attributter eller skript. Det anbefales ikke å sende komplekse uttrykk i direktivet fordi Blade internt bruker regex når de kompileres, og dette kan ødelegge ting på uventede måter.
I tillegg lar Blade deg definere malkommentarer som ikke sendes til den endelige HTML-en (i motsetning til klassiske HTML-kommentarer) og blokker @php … @endphp hvor du kan kjøre små biter av ren PHP når det er absolutt nødvendig. Du kan til og med bruke @bruk å importere klasser til visningen eller tilordne aliaser til dem, noe som er praktisk når man arbeider med hjelpere eller veldig spesifikke komponenter.
Hvis du kommer til et punkt der du trenger en svært spesialisert ekkofunksjonalitet for bestemte objekter, kan du registrere deg tilpassede ekkobehandlere med Blade::stringable()slik at når du gjentar et bestemt objekt, kaller Blade tilbakekallingen din i stedet for den magiske metoden __toString() av klassen.
Feilvisninger, fragmenter og tilpassede direktiver
Laravel lar deg tilpasse feilvisninger: bare opprett filer i resources/views/errors med HTTP-koden som navn (for eksempel 404.blade.php o 500.blade.phpHver gang den feilen oppstår, vil malen din bli brukt i stedet for den generiske malen fra rammeverket.
For tilfeller der du jobber med verktøy som Turbo eller htmx og bare ønsker å returnere spesifikke fragmenter av en visningBlade tilbyr direktivene @fragment … @endfragment kombinert med metoder som view('...')->fragment('nombre'), fragmentIf(), fragments() y fragmentsIf()På denne måten kan du gjenbruke hele den samme malen og bare trekke ut de delene du trenger, avhengig av konteksten.
Hvis repertoaret av direktiver ikke er nok for deg, kan du alltids lage dine egne med Blade::direktiv()Vanlig praksis er å registrere dem ved hjelp av metoden boot() de AppServiceProvider eller gjennom en dedikert leverandør. Blade-kompilatoren vil sende deg uttrykket i direktivet som en streng, og du returnerer PHP-koden du ønsker skal genereres ved kompilering.
For enkle, tilpassede forhold finnes det også Blad::if()som oppretter betingede direktiver på én linje. Du kan for eksempel definere @disk('s3') for å sjekke om appens standarddisk er S3, og deretter bruke den i en hvilken som helst visning som om det var et native direktiv.
Med dette arsenalet kan du sette sammen et malspråk som er praktisk tilpasset dine behov, inkludert et hasStack-type direktiv om du vil, som fungerer som syntaktisk sukker over logikken som internt sjekker om en stabel har innhold eller ikke før den skrives ut.
Å mestre Blade i dybden – fra grunnleggende syntaks til avanserte komponenter, autorisasjonspolicyer, validering, miljøer og spesielt stakkhåndtering – lar deg bygge visninger modulær, trygg, konsistent og enkel å vedlikeholdehvor et fremtidig direktiv som hasStack ville passe naturlig for å ytterligere avrunde kontrollen over hva som injiseres i hvert område av layouten din.