- Blade përpilon shabllonet .blade.php në PHP të pastër dhe ofron direktiva të pastra për kushte, sythe, paraqitje dhe komponentë.
- Skeletet e Blade (@stack, @push, @prepend) ju lejojnë të centralizoni skriptet dhe stilet, duke deleguar atë që është e stivuar te pamjet fëmijë.
- Direktivat e mjedisit, autorizimit, sesionit dhe validimit integrojnë në mënyrë të sigurt dhe ekspresive pamjet me pjesën tjetër të kornizës.
- Direktiva dhe ndihmës të personalizuara si Js::, nga open the door te modelet e avancuara, duke përfshirë një direktivë të ngjashme me hasStack.
Nëse punoni me Laravel çdo ditë, herët a vonë do të hasni Blade, direktivat e tij dhe, sigurisht, skemat e pamjeve dhe idenë e një direktive hipotetike `hasStack` për t'i menaxhuar ato më mirë. Mund të keni filluar të përdorni shabllone klasike PHP, ose mund të jeni mësuar me React ose Vue, por kur e kuptoni vërtet Blade dhe gjithçka që ofron (përfshirë skemat), atëherë organizimi juaj i pamjeve bën një hap të rëndësishëm përpara.
Në këtë artikull, do të shqyrtojmë hollësitë: do të shihni me shumë detaje se si funksionon Blade, çfarë janë direktivat e kontrollit, si strukturohen paraqitjet, komponentët, slotet, atributet, autorizimi dhe mjediset, dhe, brenda këtij konteksti, si përshtatet koncepti i pirgjeve dhe një direktivë hasStack, duke ju lejuar të kontrolloni përmbajtjen e pirgjeve para se të renderoni. E gjithë kjo do të ilustrohet me shembuj praktikë dhe një qasje realiste të projektuar për projektet moderne Laravel.
Çfarë është Blade dhe pse është thelbësore të kuptohen direktivat e tij?
Tehu është motori zyrtar i shablloneve LaravelNuk të detyron të ndalosh së përdoruri PHP, por të jep një sintaksë shumë më të pastër për përzierjen e logjikës së prezantimit dhe HTML pa hapur dhe mbyllur vazhdimisht etiketa. Gjatë gjithë kohës. Çdo shabllon .blade.php Është kompiluar në PHP të pastër dhe ruhet në memorje. storage/framework/views, kështu që mbingarkesa e kohës së ekzekutimit është minimale.
Pamjet e tehut zakonisht ruhen në burime/pikëpamje dhe kthehen nga rrugët ose kontrolluesit duke përdorur ndihmësin view()Ju mund t'i kaloni të dhënat këtij ndihmësi në një argument të dytë (matricë asociative, compact()etj.), dhe në pamje ato konsumohen me sintaksën e çelësa të dyfishtë për të shfaqur përmbajtje me kod të ecur ose me pikëçuditëse për përmbajtje pa kod të ecur.
Një avantazh i madh i Blade është se ofron direktiva specifike (fjalët që fillojnë me @) për të trajtuar kushtet, sythet, autorizimin, pirgjet e skripteve, komponentët, slotet, validimin, mjediset… E gjithë kjo e bën kodin e pamjes shumë më të lexueshëm dhe të mirëmbajtur sesa një përzierje kaotike e PHP klasike me echo dhe HTML të thjeshtë.
Sintaksa bazë e Blade: echo, escape dhe fjalë për fjalë
Operacioni më tipik në një pamje është shfaqja e të dhënave. Me Blade, për të printuar përmbajtjen e një variabli, thjesht përdorni {{ }}, e cila përkthehet nga brenda në një echo e($variable) dhe për këtë arsye, Entitetet HTML të shmangen për të parandaluar XSS:
Shfaqja e variablave të escaped është aq e thjeshtë sa:
{{ $name }}
Nëse doni të shfaqni HTML të para-gjeneruar ose përmbajtje që nuk duhet të shmanget (për shembull, sepse ju e kontrolloni atë dhe e dini se është e sigurt), mund të përdorni sintaksën {!!! !!} , e cila çaktivizon shmangien automatike dhe lejon që shfletuesi ta interpretojë atë siç është:
{!! $htmlSeguro !!}
Nëse punoni me framework-e frontend që përdorin edhe çelësa (për shembull, Vue ose ndonjë bibliotekë shabllonesh në anën e klientit), Blade ju lejon “shpëton” nga motori i vet me parashtesën @. Në këtë mënyrë, @{{ variabëlJavascript }} Nuk do të interpretohet si një shprehje Blade, por do të mbetet në HTML për t'u përpunuar nga kuadri i shfletuesit.
Kur keni blloqe të mëdha ku duhet të respektoni plotësisht kllapat e dyfishta kaçurrela pa i prekur Blade, mund t'i rrethoni ato me direktivën @verbatim … @endverbatim . Çdo gjë brenda do të mbetet e paprekur, një mjet shumë i dobishëm kur integroni shabllone komplekse të frontend-it.
Strukturat e kontrollit: if, switch, loops dhe variabla $loop
Blade ofron një set të plotë direktivash të kontrollit të rrjedhës që e mbështjellin sintaksën PHP në një mënyrë më të lexueshme dhe konsistente. Në praktikë, logjika është pothuajse identike, por ju fitoni qartësi dhe shmangni përdorimin e tepërt të etiketave PHP brenda HTML-së tuaj.
Deklaratat nëse Ato janë shkruar me @if, @elseif, @else dhe ato mbyllen me @endifJu gjithashtu keni shkurtesa si @unless (mohimi i një kushti), @isset për të verifikuar që një variabël është përcaktuar dhe @empty për të kontrolluar nëse është bosh.
Për skenarë me vlera të shumëfishta të mundshme, direktiva @ndërprerës replikon strukturën e ndërruesit PHP me @case, @break, @default dhe mbyll me @endswitch, duke lehtësuar kushtëzimin e shumëfishtë që janë të lehta për t’u lexuar.
Lidhur me sythet, ju keni @për, @foreach y @ndërsa, Plus @forelseKjo është shumë e dobishme kur doni të iteroni mbi një koleksion, por gjithashtu duhet të trajtoni rastin e një liste bosh pa shkruar një deklaratë shtesë if. @forelse ... @empty ... @endforelse Mund të shfaqësh përmbajtje alternative nëse nuk ka elementë.
Ndërsa udhëtoni nëpër një @foreachBlade e bën variablin të disponueshëm për ju $loop, një objekt që përmban informacione shumë të dobishme në lidhje me iteracionin aktual: indeksin, nëse është kthesa e parë apo e fundit, nëse indeksi është çift apo tek, sa iteracione ka gjithsej, apo edhe qasjen në lakun prind në rastin e laqeve të ndërthurura duke përdorur $loop->parent.
Trashëgimia e shabllonit, paraqitjet dhe seksionet
Në aplikacionet e botës reale, nuk duhet të përsërisni header-at, menutë ose fundfaqet në çdo pamje. Blade ju lejon të përcaktoni një paraqitja kryesore (zakonisht ruhet në) resources/views/layouts/master.blade.php) që trashëgojnë të gjitha faqet. Brenda paraqitjes ju përcaktoni zona "boshe" me @yield dhe pjesa tjetër e HTML-së së zakonshme mbetet e qëndrueshme.
Për të përdorur atë paraqitje nga një pamje fëmijërore, thjesht duhet të tregoni @extends('layouts.master') dhe deklaroni pjesët që dëshironi të plotësoni duke përdorur @seksion y @endsection. Çdo @yield('nombre') diploma e masterit do të korrespondojë me një @section('nombre') në shikimin e vajzës.
Për më tepër, direktiva @parent ju lejon jo vetëm të mbivendosni një seksion, por edhe të shtoni përmbajtje sipër ose poshtë asaj që përcakton paraqitja . Kjo është shumë e dobishme në shiritat anësorë ose blloqet që dëshironi të zgjeroni, jo të zëvendësoni.
Nëse keni nevojë të përfshini fragmente HTML të ripërdorshme pa trashëgimi të plotë, Blade ofron @përfshin dhe një familje e tërë direktivash të lidhura: @includeIf, @includeWhen, @includeUnless y @includeFirsttë cilat ju lejojnë të përfshini me kusht nën-pamje ose të zgjidhni të parën që ekziston në një listë të rrugëve të mundshme.
Për rastet kur përsëritni një fragment të vogël për secilin element të një koleksioni, direktiva @each kombinon foreach + include në një rresht të vetëm, dhe madje mund të përcaktojë një pamje alternative për rastin kur koleksioni mbërrin bosh.
Komponentët e tehut, slotet dhe atributet
Komponentët Blade janë evolucioni natyror i paraqitjeve dhe përfshijnë: ato ju lejojnë të enkapsuloni pjesë të ripërdorshme të ndërfaqes (butona, alarme, karta, formularë…) me logjikën, vetitë dhe slotet e tyre me përmbajtje që mund të injektohet nga jashtë, të gjitha me një sintaksë shumë të ngjashme me komponentët modernë të kornizës JS.
Ekzistojnë dy lloje kryesore të komponentëve: bazuar në klasë (e vendosur në app/View/Components, gjeneruar me php artisan make:component) dhe anonimtë cilat shihen vetëm në resources/views/components pa një klasë të shoqëruar. Në të dyja rastet, ato paraqiten në pamje me etiketa të tipit <x-alert /> o <x-forms.input />.
Komponentët e bazuar në klasë marrin të dhëna përmes Atributet HTML (me kebab-case në pamje dhe camelCase në konstruktor), ekspozohen në pamjen e komponentëve si veti publike dhe mund të zgjedhin një metodë shouldRender() për të vendosur me kusht nëse ato duhet të shfaqen.
Për përmbajtje fleksibile, komponentët kanë veçorinë lojëra elektronikePërmbajtja kryesore aksesohet si $slot në shabllonin e komponentëve, dhe lojëra elektronike me emër janë përcaktuar duke përdorur <x-slot name="titulo">...</x-slot> Kur përdorni komponentin. Nga brenda, mund të thirrni metodat e komponentëve përmes $component dhe madje kontrolloni nëse një vend i caktuar është bosh me $slot->isEmpty() ose nëse ka përmbajtje të vërtetë me $slot->hasActualContent().
Komponentët gjithashtu menaxhojnë me elegancë atribute shtesë që nuk përputhen me vetitë e konstruktorit (për shembull class, id, data-*E gjithë kjo është grupuar në një "qese atributesh" të aksesueshme me $attributestë cilën mund ta renderoni siç është ose ta manipuloni me metoda të tilla si merge(), class(), prepend(), filter(), whereStartsWith(), has() o get().
Përveç kësaj, Blade përfshin direktiva specifike për HTML-në tipike: @checked , @selected , @disabled , @readonly dhe @required , të cilat shtypin atributin përkatës vetëm nëse kushti që marrin vlerësohet si i vërtetë.
Paraqitjet duke përdorur komponentë dhe trashëgimi klasike
Në Laravel-in modern, po bëhet gjithnjë e më e zakonshme të përcaktohet paraqitja globale e aplikacionit si një Komponenti i tehut (për shembull, <x-layout>) në vend që të përdoret vetëm trashëgimia klasike e @extendsNë këtë mënyrë, paraqitja mund të marrë slote, atribute dhe veti njësoj si pjesa tjetër e komponentëve.
Modeli tipik përfshin krijimin e një komponenti Plan urbanistik me php artisan make:component LayoutPërcaktoni strukturën bazë HTML (header, lidhje CSS, nav, footer) në shabllonin tuaj dhe përdorni {{ $slot }} për të injektuar përmbajtjen kryesore. Opsionalisht, përcaktohet një slot i emëruar. title në mënyrë që çdo faqe të specifikojë titullin e saj në një mënyrë deklarative.
Nga ana tjetër, opsioni "klasik" ende ekziston me trashëgimia e shabllonit nëpërmjet @extends, @section y @yieldKjo përdorej gjerësisht përpara popullarizimit të komponentëve. Mund të vazhdoni të kombinoni të dyja qasjet, duke përdorur paraqitje të bazuara në komponentë për gjithçka, ose të vazhdoni me trashëgiminë tradicionale nëse projekti juaj është konfiguruar tashmë në atë mënyrë.
Në të dyja rastet, qëllimi është i njëjtë: të shmanget përsëritja e skeletit HTML në secilën pamje , të ruhet një pikë e vetme e vërtetësisë për paraqitjen dhe të lejohet që secila faqe të përqendrohet vetëm në përmbajtjen e saj specifike.
Sesioni, autentifikimi, mjedisi dhe autorizimi në Blade
Blade integrohet shumë mirë me pjesën tjetër të framework-ut, kështu që nuk kufizohet vetëm në renderimin e HTML-së: ai gjithashtu ju jep direktiva të nivelit të lartë për të bashkëvepruar me sesionin, sistemin e autentifikimit, mjedisin e aplikacionit dhe rregullat e autorizimit.
Për autentifikimin, ekzistojnë direktiva si @auth dhe @guest , të cilat shfaqin përmbajtjen e tyre vetëm nëse përdoruesi është autentifikuar ose mysafir, përkatësisht. Përveç kësaj, mund të specifikoni një roje të caktuar si argument për të rafinuar kontekstin e autentifikimit të përdorur.
L direktivat mjedisore si @production o @env('local') Ato ju lejojnë të kushtëzoni pjesë të pamjes në varësi të mjedisit aktual Laravel. Shumë të dobishme, për shembull, për shfaqjen e bannerave, gjurmëve të debugimit ose skripteve vetëm në mjedise lokale ose në fazën e instalimit.
Lidhur me sesionet, direktiva @session e bën të lehtë kontrollin nëse ekziston një çelës sesioni dhe, nëse po, jep vlerën e tij përmes variablit $value . Kjo zgjidh në mënyrë elegante rastin klasik të mesazheve ose alarmeve të menjëhershme.
Për autorizimin në stilin e politikave dhe portës, Blade ofron @qen, @nuk mundem y @kananiMe to, ju mund të shfaqni ose fshihni butona, lidhje ose blloqe të tëra në varësi të faktit nëse përdoruesi ka leje për një veprim specifik në një model ose klasë. I kombinuar me @guest o @authAto lejojnë ndërtimin e ndërfaqeve shumë më të sigurta dhe më të qarta.
Formularët, validimi dhe trajtimi i gabimeve në pamje
Kur kaloni nga pamjet statike në formularë, e shihni vërtet sa i përshtatshëm është Blade. Laravel kërkon që të përfshini një token CSRF në të gjitha format që modifikojnë të dhënat, dhe për të shmangur shkrimin manual të fushës së fshehur, ekziston direktiva `@csrf` , e cila gjeneron të dhënat hyrëse me tokenin përkatës.
Metodat HTTP si p.sh. VENDOS, ARNIM ose FSHIJ Ato simulohen përmes një fushe të fshehur _method, dhe Blade e bën atë të disponueshëm për ju @method('VENDOS') (ose PATCH/DELETE) për ta gjeneruar atë automatikisht brenda formularit.
Për të treguar gabime validimi Direktiva ekziston @gabime cila është e lidhur me një fushë specifike. Brenda saj, ju keni variablin në dispozicion. $mesazh me tekstin e gabimit. Meqenëse në fakt është një deklaratë if e kompiluar, mund të përdorni @else për të shfaqur përmbajtje alternative kur nuk ka gabim.
Objekti $gabime Është gjithmonë i pranishëm në pamje dhe grupe të të gjitha mesazheve të validimit për kërkesën aktuale. Integrohet pa probleme me ndihmësin. old(), e cila ju lejon të "ripopulloni" formularin me vlerat e paraqitura nga përdoruesi pas një dështimi të validimit, duke i ruajtur të dhënat dhe duke i shfaqur qartë gabimet.
Duke i kombinuar këto direktiva me rregullat e validimit në kontrollues ose Kërkesa për Formularë, ju keni një rrjedhë të fuqishme validimi nga ana e serverit , plotësuese të validimit nga ana e klientit dhe shumë më të sigurt kundër manipulimeve dashakeqe.
Stivat në Blade: @stack, @push, @prepend dhe koncepti hasStack
Një nga veçoritë më pak të diskutuara, por më të dobishme të Blade për projekte të mëdha janë "stacks" . Një "stack" është në thelb një koleksion fragmentesh pamjesh në të cilat mund të shtoni përmbajtje nga pamjet fëmijë, komponentët ose përfshirjet, dhe pastaj t'i paraqisni të gjitha së bashku në një pikë specifike në paraqitjen kryesore.
Direktiva `@stack('name')` specifikon se ku do të shtyhen të gjitha fragmentet e shoqëruara me atë pirg. Në të kundërt, nga çdo pamje tjetër, mund të përdorni `@push('name')` për të shtyrë përmbajtjen në fund të pirgut ose `@prepend('name') ` për ta shtyrë atë në fillim. Kjo përdoret shpesh për skripte dhe stile specifike për faqe.
Imagjinoni, për shembull, që në paraqitjen tuaj të keni diçka të tillë në <head> dhe në fund të <body>:
@stack('styles')
...
@stack('scripts')
Pastaj, në një pamje specifike që ka nevojë për JS shtesë , mund të bëni:
@push('scripts')
<script src="/js/pagina-especifica.js"></script>
@endpush
Kjo i lejon paraqitjes të shmangë njohjen e çdo skripti ose stili në çdo faqe ; përcakton vetëm pirgjet, dhe pirgjet e pamjeve fëmijë marrin atë që u nevojitet. Ekziston gjithashtu `@pushIf` për të shtyrë përmbajtjen bazuar në një kusht boolean pa pasur nevojë të shkruhet e gjithë deklarata `if`.
Brenda këtij konteksti, shumë zhvillues humbasin një direktivë si `@hasStack` ose të ngjashme që do t'u lejonte atyre të kontrollonin nëse një pirg i caktuar ka përmbajtje përpara se ta renderonin atë. Edhe pse Blade nuk përfshin një direktivë me atë emër menjëherë, ideja është e qartë: të jesh në gjendje të bësh diçka si "nëse pirgu i skripteve është bosh, mos printo etiketa shtesë" ose "nëse ka elementë në një pirg meta të dhënash, mbështilli ato në një bllok specifik".
Mënyra për të arritur sjellje ekuivalente sot është plotësoni direktivat e grumbullit me logjikën në paraqitje ose me ndihmës të personalizuar, ose edhe me direktivat tona të regjistruara nëpërmjet Blade::directive()Në këtë mënyrë, mund të simulohet një direktivë hasStack që pyet në mënyrë të brendshme pirgun përpara se të vendosë se cilin HTML të gjenerojë.
JSON, JavaScript dhe direktivat ndihmëse në Blade
Në shumë pamje të Laravel, duhet të kaloni të dhëna nga backend në JavaScript. Zakonisht, kjo përfshin kryerjen e një json_encode() të një vargu ose koleksioni dhe ta lini atë brenda një skripti në linjë, por kjo nuk është gjithmonë e sigurt ose e përshtatshme. Laravel e bën këtë më të lehtë me ndihmësin Js::from(), i cili serializon dhe i shpëton saktë vlerave PHP në JSON për t'i ngulitur në HTML.
Kur ia paraqet të dhënat komplekse shfletuesit, Js::from() Shmang problemet me thonjëza ose karaktere speciale dhe kthen një shprehje JSON.parse() I sigurt për përfshirje në atribute ose skripte. Kalimi i shprehjeve komplekse brenda direktivës nuk rekomandohet sepse Blade përdor brenda sistemit regex gjatë kompilimit të tyre, dhe kjo mund t'i prishë gjërat në mënyra të papritura.
Për më tepër, Blade ju lejon të përcaktoni komente shablloni që nuk kalohen në HTML-në përfundimtare (ndryshe nga komentet klasike HTML) dhe blloqe @php … @endphp ku mund të ekzekutoni fragmente të vogla të PHP-së së pastër kur është absolutisht e nevojshme. Madje mund të përdorni @use për të importuar klasa në pamje ose për t'u caktuar atyre pseudonime, gjë që është e dobishme kur punoni me ndihmës ose komponentë shumë specifikë.
Nëse arrini pikën ku keni nevojë për një funksionalitet shumë të specializuar të jehonës për objekte të caktuara, mund të regjistroheni trajtues të personalizuar të jehonës me Blade::stringable()në mënyrë që kur i bën jehonë një objekti specifik, Blade thërret thirrjen tuaj mbrapsht në vend të metodës magjike __toString() të klasës.
Pamjet e gabimeve, fragmentet dhe direktivat e personalizuara
Laravel ju lejon të personalizoni pamjet e gabimeve: thjesht krijoni skedarë në resources/views/errors me kodin HTTP si emër (për shembull, 404.blade.php o 500.blade.phpSa herë që ndodh ky gabim, do të përdoret shablloni juaj në vend të atij gjenerik nga framework-u.
Për rastet kur punoni me mjete si Turbo ose htmx dhe thjesht doni të ktheheni fragmente specifike të një pamjejeBlade ofron direktivat @fragment … @endfragment të kombinuara me metoda të tilla si view('...')->fragment('nombre'), fragmentIf(), fragments() y fragmentsIf()Në këtë mënyrë, mund ta ripërdorni të gjithë të njëjtin shabllon dhe të nxirrni vetëm pjesët që ju nevojiten, varësisht nga konteksti.
Nëse repertori i direktivave nuk është i mjaftueshëm për ju, gjithmonë mund të krijoni vetë me Blade::direktiv()Praktika e zakonshme është regjistrimi i tyre duke përdorur metodën boot() de AppServiceProvider ose nëpërmjet një ofruesi të dedikuar. Kompiluesi Blade do t'ju kalojë shprehjen brenda direktivës si një varg, dhe ju do të ktheni kodin PHP që dëshironi të gjenerohet gjatë kompilimit.
Për kushte të thjeshta të personalizuara ekziston edhe Blade::if()që krijon direktiva kushtëzuese në një rresht të vetëm. Për shembull, mund të përcaktoni @disk('s3') për të kontrolluar nëse disku i parazgjedhur i aplikacionit është S3, dhe më pas për ta përdorur atë në çdo pamje sikur të ishte një direktivë native.
Me këtë arsenal mund të ndërtoni një gjuhë shablloni praktikisht të përshtatur sipas nevojave tuaja , duke përfshirë një direktivë të tipit hasStack nëse dëshironi, e cila vepron si sheqer sintaksor në logjikën që kontrollon në mënyrë të brendshme nëse një pirg ka përmbajtje apo jo përpara se ta printojë atë.
Zotërimi i thellë i Blade - nga sintaksa bazë te komponentët e avancuar, direktivat e autorizimit, validimi, mjediset dhe mbi të gjitha, menaxhimi i stivës - ju lejon të ndërtoni pamje modulare, të sigurta, konsistente dhe të lehta për t'u mirëmbajtur , ku një direktivë e ardhshme si hasStack do të përshtatej natyrshëm për të plotësuar më tej kontrollin mbi atë që injektohet në secilën zonë të paraqitjes suaj.