- Блејд компајлира .blade.php шаблоне у чисти PHP и нуди чисте директиве за условне изразе, петље, распореде и компоненте.
- Блејдови стекови (@stack, @push, @prepend) вам омогућавају да централизујете скрипте и стилове, делегирајући оно што је наслагано подређеним приказима.
- Директиве за окружење, ауторизацију, сесију и валидацију безбедно и експресно интегришу приказе са остатком оквира.
- Прилагођене директиве и помоћници попут Js::from отварају врата напредним шаблонима, укључујући директиву сличну hasStack-у.
Ако свакодневно радите са Ларавелом, пре или касније ћете наићи на Блејд, његове директиве и, наравно, стекове прегледа и идеју хипотетичке директиве `hasStack` за боље управљање њима. Можда сте дошли са класичних PHP шаблона или сте можда навикли на React или Vue, али када заиста разумете Блејд и све што он нуди (укључујући стекове), тада ваша организација прегледа прави значајан корак напред.
У овом чланку ћемо се позабавити замршеностима: видећете детаљно како Blade функционише, шта су контролне директиве, како су структурирани распореди, компоненте, слотови, атрибути, ауторизација и окружења и, у том контексту, како се уклапају концепт стекова и директива hasStack, омогућавајући вам да проверите наслагани садржај пре рендеровања. Све ово ће бити илустровано практичним примерима и реалистичним приступом дизајнираним за модерне Laravel пројекте.
Шта је Блејд и зашто је кључно разумети његове директиве?
Блејд је Званични Laravel шаблонски механизамНе приморава вас да престанете да користите PHP, али вам даје много чистију синтаксу за комбиновање презентационе логике и HTML-а без сталног отварања и затварања ознака. Све време. Сваки шаблон .blade.php Компајлира се у чисти PHP и кешира се у storage/framework/views, тако да су трошкови извршавања минимални.
Прикази сечива се обично чувају у ресурси/прегледи и враћају се са рута или контролера користећи помоћну функцију view()Можете проследити податке овом помоћнику у другом аргументу (асоцијативни низ, compact()итд.), а у приказу су конзумирани синтаксом од двоструки кључеви за приказивање избегнутог садржаја или са узвичницима за неизбегнути садржај.
Главна предност Блејда је то што нуди посебне директиве (речи које почињу са @) за руковање условима, петљама, ауторизацијом, стековима скрипти, компонентама, слотовима, валидацијом, окружењима… Све ово чини код приказа много читљивијим и лакшим за одржавање од хаотичне мешавине класичног PHP-а са echo и обичан HTML.
Основна синтакса Блејда: echo, escape и verbatim
Најтипичнија операција у приказу је приказивање података. Са Blade-ом, да бисте исписали садржај променљиве, једноставно користите {{ }}, што се интерно преводи у echo e($variable) и стога, Избегавање HTML ентитета ради спречавања XSS-а:
Приказивање избегнутих променљивих је једноставно као:
{{ $name }}
Ако желите да прикажете унапред генерисани HTML или садржај који не би требало да буде избегнут (на пример, зато што га контролишете и знате да је безбедан), можете користити синтаксу {!! !!} , која онемогућава аутоматско избегнуто дељење и омогућава прегледачу да га интерпретира као што јесте:
{!! $htmlSeguro !!}
Ако радите са фронтенд фрејмворцима који такође користе кључеве (на пример, Vue или нека библиотека шаблона на страни клијента), Blade вам омогућава „побегне“ из сопственог мотора са префиксом @. На овај начин, @{{ променљиваЈаваскрипт }} Неће бити интерпретиран као Blade израз, већ ће остати у HTML-у да би га обрадио оквир прегледача.
Када имате велике блокове где је потребно у потпуности поштовати дупле витичасте заграде, а да их Блејд не додирне, можете их окружити директивом @verbatim … @endverbatim . Све унутра ће остати нетакнуто, што је веома користан алат при интеграцији сложених шаблона за фронтенд.
Контролне структуре: if, switch, петље и променљива $loop
Блејд нуди комплетан сет директива за контролу тока које обухватају PHP синтаксу на читљивији и конзистентнији начин. У пракси, логика је готово идентична, али добијате јасноћу и избегавате прекомерну употребу PHP ознака унутар вашег HTML-а.
if наредбе су написани са @if, @elseif, @else и затварају се са @endifТакође имате пречице као што су @unless (негација услова), @isset да се провери да ли је променљива дефинисана и @empty да проверим да ли је празно.
За сценарије са више могућих вредности, директива @прекидач реплицира PHP структуру switch-а са @case, @break, @default и затворити са @endswitch, што олакшава коришћење вишеструких условних израза који се лако читају.
Што се тиче петљи, имате @за, @за сваки y @whileпоред @forelseОво је веома корисно када желите да итерирате кроз колекцију, али такође треба да обрадите случај празне листе без писања додатне if наредбе. @forelse ... @empty ... @endforelse Можете приказати алтернативни садржај ако нема елемената.
Док путујете кроз @за свакиБлејд вам ставља варијаблу на располагање $петља, објекат који садржи веома корисне информације о тренутној итерацији: индекс, да ли је први или последњи потез, да ли је индекс паран или непаран, колико укупно итерација постоји, или чак приступ родитељској петљи у случају угнежђених петљи које користе $loop->parent.
Наслеђивање шаблона, распореди и одељци
У стварним апликацијама, не желите да понављате заглавља, меније или подножја у сваком приказу. Блејд вам омогућава да дефинишете главни распоред (обично се чува у) resources/views/layouts/master.blade.php) које све странице наслеђују. Унутар распореда дефинишете „празне“ области са @yield а остатак уобичајеног HTML-а остаје стабилан.
Да бисте користили тај распоред из подређеног приказа, само треба да назначите @extends('layouts.master') и декларишите одељке које желите да попуните користећи @section y @ендсецтион. Свака @yield('nombre') мастер диплома ће одговарати @section('nombre') у мишљењу ћерке.
Штавише, директива @parent вам омогућава не само да замените одељак, већ и да додате садржај изнад или испод онога што распоред дефинише . Ово је веома корисно у бочним тракама или блоковима које желите да проширите, а не да замените.
Ако треба да укључите HTML фрагменте за вишекратну употребу без потпуног наслеђивања, Blade пружа @инцлуде и читава породица повезаних директива: @includeIf, @includeWhen, @includeUnless y @includeFirstкоји вам омогућавају да условно укључите подприказе или изаберете први који постоји на листи могућих рута.
За случајеве када понављате мали фрагмент за сваки елемент колекције, директива @each комбинује foreach + include у једну линију и чак може дефинисати алтернативни приказ за случај када колекција стиже празна.
Компоненте, слотови и атрибути сечива
Блејд компоненте су природна еволуција распореда и укључују: омогућавају вам да капсулирате делове интерфејса за вишекратну употребу (дугмад, упозорења, картице, форме...) са сопственом логиком, својствима и слотовима са садржајем који се може убризгати споља, све са синтаксом веома блиском модерним JS компонентама фрејмворка.
Постоје две главне врсте компоненти: заснован на класи (налази се у app/View/Components, генерисано са php artisan make:component) и анониманкоје се виде само у resources/views/components без придружене класе. У оба случаја, приказују се у приказима са ознакама типа <x-alert /> o <x-forms.input />.
Компоненте засноване на класи примају податке путем HTML атрибути (са kebab-case на видику и camelCase у конструктору), су изложене у приказу компоненте као јавна својства и могу се одлучити за метод shouldRender() да условно одлучи да ли треба да буду приказани.
За флексибилан садржај, компоненте садрже слотаГлавном садржају се приступа као $slot у шаблону компоненте и слотови са именом су дефинисани коришћењем <x-slot name="titulo">...</x-slot> Када користите компоненту. Изнутра можете позивати методе компоненте путем $component и чак проверити да ли је слот празан са $slot->isEmpty() или ако има прави садржај са $slot->hasActualContent().
Компоненте такође елегантно управљају додатни атрибути које се не подударају са својствима конструктора (на пример class, id, data-*Све ово је груписано у приступачну „кесу атрибута“ са $attributesкоје можете рендеровати какве јесу или манипулисати методама као што су merge(), class(), prepend(), filter(), whereStartsWith(), has() o get().
Поред тога, Blade укључује специфичне директиве за типичан HTML облик: @checked , @selected , @disabled , @readonly и @required , које исписују одговарајући атрибут само ако је услов који приме вреднован као тачан.
Распореди који користе компоненте и класично наслеђивање
У модерном Ларавелу, све је чешће дефинисати глобални распоред апликације као Компонента сечива (на пример, <x-layout>) уместо да се користи само класично наслеђивање @extendsНа овај начин, распоред може да прими слотове, атрибуте и својства баш као и остале компоненте.
Типичан образац укључује креирање компоненте Распоред са php artisan make:component LayoutДефинишите основну HTML структуру (заглавље, CSS линкове, навигацију, подножје) у вашем шаблону и користите је {{ $slot }} да убризгате главни садржај. Опционо, дефинише се именовани слот. title тако да свака страница декларативно наводи свој наслов.
С друге стране, „класична“ опција и даље постоји са наслеђивање шаблона виа @extends, @section y @yieldОво се широко користило пре популаризације компоненти. Можете наставити да комбинујете оба приступа, користећи распореде засноване на компонентама за све, или се држати традиционалног наслеђивања ако је ваш пројекат већ тако подешен.
У оба случаја, циљ је исти: избећи понављање HTML скелета у сваком приказу , одржати јединствену тачку истинитости за распоред и омогућити свакој страници да се фокусира искључиво на свој специфични садржај.
Сесија, аутентификација, окружење и ауторизација у Блејду
Блејд се веома добро интегрише са остатком фрејмворка, тако да није ограничен само на рендеровање HTML-а: такође вам даје директиве високог нивоа за интеракцију са сесијом, системом за аутентификацију, окружењем апликације и правилима ауторизације.
За аутентификацију постоје директиве попут @auth и @guest , које приказују свој садржај само ако је корисник аутентификован, односно гост. Поред тога, можете навести одређени guard као аргумент да бисте прецизирали контекст аутентификације који се користи.
Тхе директиве о заштити животне средине као @production o @env('local') Омогућавају вам да условљавате делове приказа у зависности од тренутног Laravel окружења. Веома корисно, на пример, за приказивање банера, трагова дебаговања или скрипти само у локалним или припремним окружењима.
Што се тиче сесија, директива @session олакшава проверу да ли постоји кључ сесије и, ако постоји, пружа његову вредност путем променљиве $value . Ово елегантно решава класичан случај флеш порука или упозорења.
За политику и ауторизацију у стилу капије, Blade пружа @can, @не може y @кананиПомоћу њих можете приказати или сакрити дугмад, линкове или целе блокове у зависности од тога да ли корисник има дозволу за одређену радњу на моделу или класи. У комбинацији са @guest o @authОни омогућавају изградњу много безбеднијих и јаснијих интерфејса.
Обрасци, валидација и обрада грешака у приказима
Када пређете са статичких приказа на форме, заиста видите колико је Blade практичан. Laravel захтева да укључите CSRF токен у све форме које модификују податке, а да бисте избегли ручно писање скривеног поља, постоји директива `@csrf` , која генерише улаз са одговарајућим токеном.
HTTP методе као што су СТАВИ, ЗАКРИЈ или ОБРИШИ Симулирају се кроз скривено поље _method, а Блејд вам то ставља на располагање @метод('ПУТ') (или PATCH/DELETE) да бисте га аутоматски генерисали унутар форме.
Показати грешке валидације Директива постоји @грешкакоји је повезан са одређеним пољем. Унутар њега имате доступну променљиву. $мессаге са текстом грешке. Пошто је то заправо компајлирана if наредба, можете користити @else да прикаже алтернативни садржај када нема грешке.
Објекат $грешке Увек је присутан у приказима и групише све поруке валидације за тренутни захтев. Беспрекорно се интегрише са помоћником. old(), што вам омогућава да „поново попуните“ образац вредностима које је корисник унео након неуспеха валидације, чувајући уносе и јасно приказујући грешке.
Комбиновањем ових директива са правилима валидације у контролерима или захтевима за образац, добијате робустан ток валидације на страни сервера , који допуњује валидацију на страни клијента и много је безбеднији од злонамерних манипулација.
Стекови у Blade-у: @stack, @push, @prepend и концепт hasStack
Једна од мање дискутованих, али најкориснијих карактеристика Блејда за велике пројекте су стекови . Стек је у суштини колекција фрагмената приказа којима можете додати садржај из подређених приказа, компоненти или укључених елемената, а затим све то заједно приказати на одређеној тачки у главном распореду.
Директива `@stack('name')` одређује где ће сви фрагменти повезани са тим стеком бити помештени. Насупрот томе, из било ког другог приказа, можете користити `@push('name')` да бисте померили садржај на крај стека или `@prepend('name') ` да бисте га померили на почетак. Ово се често користи за скрипте и стилове специфичне за страницу.
Замислите, на пример, да у свом распореду имате нешто овако у <head> и на крају <body>:
@stack('styles')
...
@stack('scripts')
Затим, у одређеном приказу коме је потребан додатни JS , можете урадити:
@push('scripts')
<script src="/js/pagina-especifica.js"></script>
@endpush
Ово омогућава да распоред избегне потребу да познаје сваки скрипт или стил на свакој страници ; дефинише само стекове, а подређени прикази складиште оно што им је потребно. Такође постоји `@pushIf` за слање садржаја на основу буловог услова без потребе за писањем целог `if` израза.
У овом контексту, многи програмери пропуштају директиву попут `@hasStack` или сличну која би им омогућила да провере да ли дати стек има садржај пре него што га рендерују. Иако Blade не укључује директиву са тим именом одмах, идеја је јасна: да би се могло урадити нешто попут „ако је стек скрипте празан, не исписуј додатне ознаке“ или „ако постоје елементи у стеку метаподатака, умотај их у одређени блок“.
Начин да се данас постигне еквивалентно понашање је допунити директиве стека логиком у распореду или са прилагођеним помоћницима, или чак са нашим сопственим регистрованим директивама путем Blade::directive()На овај начин, може се симулирати директива hasStack која интерно упитује стек пре него што одлучи који HTML да генерише.
JSON, JavaScript и помоћне директиве у Blade-у
У многим Laravel приказима, потребно је да проследите податке из бекенда у JavaScript. Обично то подразумева извођење json_encode() низа или колекције и оставити га унутар инлајн скрипте, али то није увек безбедно или згодно. Ларавел ово олакшава помоћу помоћника Js::from(), који серијализује и исправно избегава PHP вредности у JSON за уграђивање у HTML.
Када приказујете сложене податке у прегледачу, Js::from() Избегава проблеме са наводницима или специјалним знаковима и враћа израз JSON.parse() Безбедно за укључивање у атрибуте или скрипте. Преношење сложених израза унутар директиве се не препоручује јер Блејд интерно користи регуларне изразе приликом њиховог компајлирања, а то може довести до неочекиваних проблема.
Штавише, Blade вам омогућава да дефинишете коментаре шаблона који се не прослеђују у коначни HTML (за разлику од класичних HTML коментара) и @php … @endphp блокове где можете да извршите мале фрагменте чистог PHP-а када је то апсолутно неопходно. Можете чак користити @use да увезете класе у приказ или им доделите алијасе, што је корисно када радите са помоћним компонентама или веома специфичним компонентама.
Ако дођете до тачке где вам је потребна високо специјализована функционалност одјека за одређене објекте, можете се регистровати прилагођени обрађивачи одјека са Blade::stringable()тако да приликом појављивања одређеног објекта, Blade позива ваш повратни позив уместо магичне методе __toString() разреда.
Прикази грешака, фрагменти и прилагођене директиве
Ларавел вам омогућава да прилагодите прикази грешакаједноставно креирајте датотеке у resources/views/errors са HTTP кодом као именом (на пример, 404.blade.php o 500.blade.phpСваки пут када се та грешка догоди, ваш шаблон ће бити коришћен уместо генеричког из оквира.
За случајеве када радите са алатима као што су Turbo или htmx и само желите да се вратите одређени фрагменти погледаБлејд нуди директиве @фрагмент … @крајфрагмента комбиновано са методама као што су view('...')->fragment('nombre'), fragmentIf(), fragments() y fragmentsIf()На овај начин можете поново користити исти цео шаблон и издвојити само делове који су вам потребни у зависности од контекста.
Ако вам репертоар директива није довољан, увек можете да креирате своје помоћу Blade::directive()Уобичајена пракса је да се региструју коришћењем методе boot() de AppServiceProvider или преко наменског провајдера. Компилатор Blade ће вам проследити израз унутар директиве као стринг, а ви ћете вратити PHP код који желите да се генерише приликом компајлирања.
За једноставне прилагођене услове постоји и Сејд::ако()што креира условне директиве у једном реду. На пример, могли бисте дефинисати @disk('s3') да провери да ли је подразумевани диск апликације S3, а затим га користи у било ком приказу као да је нативна директива.
Са овим арсеналом можете направити језик шаблона практично прилагођен вашим потребама , укључујући директиву типа hasStack ако желите, која делује као синтаксички шећер у логици која интерно проверава да ли стек има садржај или не пре него што га испише.
Детаљно савладавање Blade-а — од основне синтаксе до напредних компоненти, директива за ауторизацију, валидације, окружења и пре свега, управљања стеком — омогућава вам да изградите модуларне, безбедне, конзистентне и једноставне за одржавање приказе , где би се будућа директива попут hasStack-а природно уклопила како би додатно заокружила контролу над оним што се убризгава у сваку област вашег распореда.