قالب های تیغه
- معرفی
- نمایش داده ها
- دستورالعمل های تیغه
- اجزاء
- اجزای ناشناس
- چیدمان ساختمان
- تشکیل می دهد
- پشته ها
- تزریق خدمات
- رندر کردن قالب های تیغه درون خطی
- رندر قطعات تیغه
- تیغه گسترش دهنده
معرفی
Blade موتور قالب ساده و در عین حال قدرتمندی است که در لاراول گنجانده شده است. برخلاف برخی از موتورهای قالب PHP، Blade شما را از استفاده از کد PHP ساده در قالب های خود محدود نمی کند. در واقع، تمام قالبهای Blade در کدهای PHP ساده کامپایل میشوند و تا زمانی که اصلاح شوند در حافظه پنهان ذخیره میشوند، به این معنی که Blade اساساً سربار صفر را به برنامه شما اضافه میکند. فایل های قالب Blade از
.blade.php
پسوند فایل استفاده می کنند و معمولاً در
resources/views
دایرکتوری ذخیره می شوند.
نماهای تیغه ممکن است از مسیرها یا کنترلرها با استفاده از
view
کمک کننده جهانی بازگردانده شوند. البته همانطور که در مستندات نماها ذکر شد
،
view
داده ها ممکن است با استفاده از آرگومان دوم کمک کننده
به نمای Blade ارسال شوند :
Route::get('/', function () { return view('greeting', ['name' => 'Finn']);});
تیغه سوپرشارژر با Livewire
آیا می خواهید قالب های Blade خود را به سطح بعدی ببرید و به راحتی رابط های پویا بسازید؟ Laravel Livewire را بررسی کنید . Livewire به شما امکان می دهد کامپوننت های Blade را بنویسید که با عملکردهای پویا تقویت شده اند که معمولاً فقط از طریق فریم ورک های فرانت اند مانند React یا Vue امکان پذیر است، و یک رویکرد عالی برای ساخت فرانت اندهای مدرن و واکنشی بدون پیچیدگی ها، رندر سمت مشتری یا مراحل ساخت را ارائه می دهد. بسیاری از چارچوب های جاوا اسکریپت
نمایش داده ها
میتوانید دادههایی را که به نمای Blade ارسال میشوند، با قرار دادن متغیر در بریسهای فرفری نمایش دهید. به عنوان مثال، با توجه به مسیر زیر:
Route::get('/', function () { return view('welcome', ['name' => 'Samantha']);});
می توانید محتویات متغیر را
name
به صورت زیر نمایش دهید:
Hello, {{ $name }}.
عبارات اکو Blade
{{ }}
به طور خودکار از طریق تابع PHPhtmlspecialchars
برای جلوگیری از حملات XSS ارسال می شود.
شما محدود به نمایش محتویات متغیرهای ارسال شده به view نیستید. همچنین می توانید نتایج هر تابع PHP را تکرار کنید. در واقع، شما می توانید هر کد PHP را که می خواهید در داخل دستور Blade echo قرار دهید:
The current UNIX timestamp is {{ time() }}.
کدگذاری موجودیت HTML
به طور پیش فرض، Blade (و
e
تابع لاراول) موجودیت های HTML را دو برابر می کند. اگر می خواهید رمزگذاری دوگانه را غیرفعال کنید،
Blade::withoutDoubleEncoding
متد را از
boot
متد خود فراخوانی کنید
AppServiceProvider
:
<?php namespace App\Providers; use Illuminate\Support\Facades\Blade;use Illuminate\Support\ServiceProvider; class AppServiceProvider extends ServiceProvider{ /** * Bootstrap any application services. */ public function boot(): void { Blade::withoutDoubleEncoding(); }}
نمایش داده های بدون فرار
به طور پیش فرض، عبارات Blade
{{ }}
به طور خودکار از طریق تابع PHP
htmlspecialchars
برای جلوگیری از حملات XSS ارسال می شوند. اگر نمیخواهید دادههای شما از بین بروند، میتوانید از دستور زیر استفاده کنید:
Hello, {!! $name !!}.
هنگام بازتاب محتوایی که توسط کاربران برنامه شما ارائه می شود بسیار مراقب باشید. برای جلوگیری از حملات XSS هنگام نمایش دادههای ارائهشده توسط کاربر، معمولاً باید از دستور پرانتز فرار و دوتایی استفاده کنید.
فریم ورک های Blade و JavaScript
از آنجایی که بسیاری از فریم ورکهای جاوا اسکریپت نیز از پرانتزهای "فرج" برای نشان دادن نمایش یک عبارت معین در مرورگر استفاده میکنند، میتوانید از
@
نماد برای اطلاع رسانی به موتور رندر Blade استفاده کنید که یک عبارت باید دست نخورده باقی بماند. مثلا:
<h1>Laravel</h1> Hello, @{{ name }}.
در این مثال،
@
نماد توسط Blade حذف خواهد شد. با این حال،
{{ name }}
بیان توسط موتور Blade دست نخورده باقی می ماند و به آن اجازه می دهد تا توسط چارچوب جاوا اسکریپت شما ارائه شود.
این
@
نماد همچنین ممکن است برای فرار از دستورات Blade استفاده شود:
{{-- Blade template --}}@@if() <!-- HTML output -->@if()
رندر JSON
گاهی اوقات ممکن است یک آرایه را به نمای خود ارسال کنید تا آن را به صورت JSON ارائه کنید تا یک متغیر جاوا اسکریپت را مقداردهی کنید. مثلا:
<script> var app = <?php echo json_encode($array); ?>;</script>
با این حال، به جای تماس دستی
json_encode
، می توانید از
Illuminate\Support\Js::from
دستورالعمل متد استفاده کنید. متد
from
همان آرگومان های
json_encode
تابع PHP را می پذیرد. با این حال، اطمینان حاصل می کند که JSON حاصل به درستی برای گنجاندن در نقل قول های HTML فرار می کند. متد
from
یک دستور جاوا اسکریپت رشته ای را برمی گرداند
JSON.parse
که شی یا آرایه داده شده را به یک شی جاوا اسکریپت معتبر تبدیل می کند:
<script> var app = {{ Illuminate\Support\Js::from($array) }};</script>
آخرین نسخههای اسکلت برنامه لاراول شامل یک
Js
نما است که دسترسی راحت به این قابلیت را در قالبهای Blade شما فراهم میکند:
<script> var app = {{ Js::from($array) }};</script>
شما فقط باید از
Js::from
روش برای ارائه متغیرهای موجود به صورت JSON استفاده کنید. قالب Blade بر اساس عبارات منظم است و تلاش برای انتقال یک عبارت پیچیده به دستورالعمل ممکن است باعث خرابی های غیرمنتظره شود.
بخشنامه
@verbatim
اگر متغیرهای جاوا اسکریپت را در بخش بزرگی از قالب خود نمایش می دهید، می توانید HTML را در
@verbatim
دستورالعمل قرار دهید تا مجبور نباشید هر عبارت Blade echo را با یک
@
علامت پیشوند قرار دهید:
@verbatim <div class="container"> Hello, {{ name }}. </div>@endverbatim
دستورالعمل های تیغه
علاوه بر وراثت قالب و نمایش داده ها، Blade همچنین میانبرهای مناسبی را برای ساختارهای رایج کنترل PHP، مانند دستورات شرطی و حلقه ها، فراهم می کند. این میانبرها روشی بسیار تمیز و مختصر برای کار با ساختارهای کنترل PHP ارائه میکنند و در عین حال برای همتایان PHP خود آشنا هستند.
اگر بیانیه ها
شما می توانید
if
با استفاده از دستورات
@if
،،
و دستورالعمل ها
@elseif
را بسازید
. این دستورالعمل ها مشابه همتایان PHP خود عمل می کنند:
@else
@endif
@if (count($records) === 1) I have one record!@elseif (count($records) > 1) I have multiple records!@else I don't have any records!@endif
برای راحتی، Blade همچنین
@unless
دستورالعملی را ارائه می دهد:
@unless (Auth::check()) You are not signed in.@endunless
علاوه بر دستورالعملهای شرطی که قبلاً مورد بحث قرار گرفت، دستورات
@isset
و
@empty
ممکن است به عنوان میانبرهای مناسب برای توابع PHP مربوطه خود استفاده شوند:
@isset($records) // $records is defined and is not null...@endisset @empty($records) // $records is "empty"...@endempty
دستورالعمل های احراز هویت
دستورات
@auth
و
@guest
ممکن است برای تعیین سریع اینکه آیا کاربر فعلی
احراز هویت شده
است یا مهمان است استفاده شود:
@auth // The user is authenticated...@endauth @guest // The user is not authenticated...@endguest
در صورت نیاز، میتوانید محافظ احراز هویت را مشخص کنید که باید هنگام استفاده از دستورالعملها
@auth
و
@guest
دستورالعملها بررسی شود:
@auth('admin') // The user is authenticated...@endauth @guest('admin') // The user is not authenticated...@endguest
دستورالعمل های محیط زیست
می توانید بررسی کنید که آیا برنامه در محیط تولید با استفاده از
@production
دستورالعمل اجرا می شود:
@production // Production specific content...@endproduction
یا، می توانید تعیین کنید که آیا برنامه در یک محیط خاص با استفاده از
@env
دستورالعمل اجرا می شود:
@env('staging') // The application is running in "staging"...@endenv @env(['staging', 'production']) // The application is running in "staging" or "production"...@endenv
بخش دستورالعمل ها
شما می توانید با استفاده از دستورالعمل تعیین کنید که آیا یک بخش وراثت الگو دارای محتوا است
@hasSection
:
@hasSection('navigation') <div class="pull-right"> @yield('navigation') </div> <div class="clearfix"></div>@endif
می توانید از
sectionMissing
دستورالعمل برای تعیین اینکه آیا یک بخش محتوا ندارد استفاده کنید:
@sectionMissing('navigation') <div class="pull-right"> @include('default-navigation') </div>@endif
دستورالعمل های جلسه
دستورالعمل
@session
ممکن است برای تعیین اینکه آیا یک مقدار
جلسه
وجود دارد استفاده می شود. اگر مقدار جلسه وجود داشته باشد، محتویات قالب در دستورالعمل ها
@session
و
@endsession
دستورالعمل ها ارزیابی می شود. در
@session
محتویات دستورالعمل، می توانید
$value
متغیر را برای نمایش مقدار جلسه بازتاب دهید:
@session('status') <div class="p-4 bg-green-100"> {{ $value }} </div>@endsession
تغییر بیانیه ها
دستورات سوئیچ را می توان با استفاده از
@switch
دستورات
@case
،،
و
دستورات
ساخت :
@break
@default
@endswitch
@switch($i) @case(1) First case... @break @case(2) Second case... @break @default Default case...@endswitch
حلقه ها
علاوه بر دستورات شرطی، Blade دستورالعمل های ساده ای برای کار با ساختارهای حلقه PHP ارائه می دهد. باز هم، هر یک از این دستورالعمل ها به طور یکسان با همتایان PHP خود عمل می کنند:
@for ($i = 0; $i < 10; $i++) The current value is {{ $i }}@endfor @foreach ($users as $user) <p>This is user {{ $user->id }}</p>@endforeach @forelse ($users as $user) <li>{{ $user->name }}</li>@empty <p>No users</p>@endforelse @while (true) <p>I'm looping forever.</p>@endwhile
هنگام تکرار از طریق یک
foreach
حلقه، می توانید از متغیر حلقه برای به دست آوردن اطلاعات ارزشمند در مورد حلقه استفاده کنید، مانند اینکه آیا در اولین یا آخرین تکرار از طریق حلقه هستید.
هنگام استفاده از حلقهها، میتوانید تکرار فعلی را نادیده بگیرید یا با استفاده از دستورات
@continue
و حلقه را خاتمه دهید
@break
:
@foreach ($users as $user) @if ($user->type == 1) @continue @endif <li>{{ $user->name }}</li> @if ($user->number == 5) @break @endif@endforeach
همچنین می توانید شرایط ادامه یا شکست را در اعلامیه دستورالعمل قرار دهید:
@foreach ($users as $user) @continue($user->type == 1) <li>{{ $user->name }}</li> @break($user->number == 5)@endforeach
متغیر حلقه
در حین تکرار از طریق یک
foreach
حلقه، یک
$loop
متغیر در داخل حلقه شما در دسترس خواهد بود. این متغیر دسترسی به برخی از بیت های مفید از اطلاعات مانند شاخص حلقه جاری و اینکه آیا این اولین یا آخرین تکرار از طریق حلقه است را فراهم می کند:
@foreach ($users as $user) @if ($loop->first) This is the first iteration. @endif @if ($loop->last) This is the last iteration. @endif <p>This is user {{ $user->id }}</p>@endforeach
$loop
اگر در یک حلقه تودرتو هستید، می توانید از طریق ویژگی به متغیر
حلقه والد دسترسی پیدا کنید
parent
:
@foreach ($users as $user) @foreach ($user->posts as $post) @if ($loop->parent->first) This is the first iteration of the parent loop. @endif @endforeach@endforeach
این
$loop
متغیر همچنین دارای خواص مفید دیگری نیز می باشد:
ویژگی | شرح |
---|---|
$loop->index |
شاخص تکرار حلقه جاری (از 0 شروع می شود). |
$loop->iteration |
تکرار حلقه جاری (از 1 شروع می شود). |
$loop->remaining |
تکرارهای باقی مانده در حلقه |
$loop->count |
تعداد کل موارد در آرایه در حال تکرار. |
$loop->first |
آیا این اولین تکرار از طریق حلقه است. |
$loop->last |
آیا این آخرین تکرار از طریق حلقه است. |
$loop->even |
آیا این یک تکرار یکنواخت از طریق حلقه است. |
$loop->odd |
آیا این یک تکرار عجیب و غریب از طریق حلقه است. |
$loop->depth |
سطح تودرتوی حلقه جاری. |
$loop->parent |
هنگامی که در یک حلقه تودرتو، متغیر حلقه والد. |
کلاس ها و سبک های مشروط
این
@class
دستورالعمل به صورت مشروط یک رشته کلاس CSS را کامپایل می کند. دستورالعمل آرایه ای از کلاس ها را می پذیرد که در آن کلید آرایه شامل کلاس یا کلاس هایی است که می خواهید اضافه کنید، در حالی که مقدار یک عبارت بولی است. اگر عنصر آرایه دارای یک کلید عددی باشد، همیشه در لیست کلاس رندر شده قرار می گیرد:
@php $isActive = false; $hasError = true;@endphp <span @class([ 'p-4', 'font-bold' => $isActive, 'text-gray-500' => ! $isActive, 'bg-red' => $hasError,])></span> <span class="p-4 text-gray-500 bg-red"></span>
به همین ترتیب،
@style
دستورالعمل ممکن است برای اضافه کردن مشروط سبک های CSS درون خطی به یک عنصر HTML استفاده شود:
@php $isActive = true;@endphp <span @style([ 'background-color: red', 'font-weight: bold' => $isActive,])></span> <span style="background-color: red; font-weight: bold;"></span>
ویژگی های اضافی
برای راحتی، می توانید از
@checked
دستورالعمل استفاده کنید تا به راحتی مشخص کنید که آیا یک ورودی چک باکس HTML "بررسی شده است".
checked
اگر شرایط ارائه شده به صورت زیر ارزیابی شود،
این دستورالعمل تکرار می شود
true
:
<input type="checkbox" name="active" value="active" @checked(old('active', $user->active)) />
به همین ترتیب،
@selected
دستورالعمل ممکن است برای نشان دادن اینکه آیا یک گزینه انتخاب داده شده باید "انتخاب شود" استفاده شود:
<select name="version"> @foreach ($product->versions as $version) <option value="{{ $version }}" @selected(old('version') == $version)> {{ $version }} </option> @endforeach</select>
علاوه بر این،
@disabled
دستورالعمل ممکن است برای نشان دادن اینکه آیا یک عنصر داده شده باید "غیرفعال" شود یا خیر استفاده شود:
<button type="submit" @disabled($errors->isNotEmpty())>Submit</button>
علاوه بر این،
@readonly
دستورالعمل ممکن است برای نشان دادن اینکه آیا یک عنصر معین باید "فقط خواندنی" باشد یا خیر استفاده شود:
<input type="email" name="email" value="email@laravel.com" @readonly($user->isNotAdmin()) />
علاوه بر این،
@required
دستورالعمل ممکن است برای نشان دادن اینکه آیا یک عنصر معین باید "الزامی" باشد استفاده شود:
<input type="text" name="title" value="title" @required($user->isAdmin()) />
از جمله مشاهده های فرعی
در حالی که شما برای استفاده از دستورالعمل آزاد هستید ، اجزای
@include
Blade عملکردهای مشابهی را ارائه می دهند و مزایای متعددی مانند اتصال داده ها و ویژگی ها را نسبت به دستورالعمل ارائه می دهند.@include
دستورالعمل Blade
@include
به شما این امکان را می دهد که نمای Blade را از یک نمای دیگر اضافه کنید. تمام متغیرهایی که برای نمای والد در دسترس هستند برای نمای شامل در دسترس قرار خواهند گرفت:
<div> @include('shared.errors') <form> <!-- Form Contents --> </form></div>
حتی اگر نمای شامل تمام دادههای موجود در نمای والد را به ارث ببرد، میتوانید آرایهای از دادههای اضافی را نیز ارسال کنید که باید در دسترس نمای گنجانده شده قرار گیرند:
@include('view.name', ['status' => 'complete'])
اگر سعی کنید به
@include
نمایی که وجود ندارد، لاراول خطا می دهد. اگر میخواهید دیدگاهی را وارد کنید که ممکن است وجود داشته باشد یا نباشد، باید از
@includeIf
دستورالعمل استفاده کنید:
@includeIf('view.name', ['status' => 'complete'])
اگر مایلید که یک عبارت بولی داده شده را به
یا
@include
ارزیابی کنید
، می توانید از دستورات
و استفاده کنید
:
true
false
@includeWhen
@includeUnless
@includeWhen($boolean, 'view.name', ['status' => 'complete']) @includeUnless($boolean, 'view.name', ['status' => 'complete'])
برای گنجاندن اولین نمای که از یک آرایه معین از نماها وجود دارد، می توانید از
includeFirst
دستورالعمل استفاده کنید:
@includeFirst(['custom.admin', 'admin'], ['status' => 'complete'])
شما باید از استفاده از ثابتها
__DIR__
و__FILE__
در نمای Blade خودداری کنید، زیرا آنها به مکان نمای ذخیرهسازی شده و کامپایل شده اشاره میکنند.
نمایش نماها برای مجموعه ها
شما می توانید حلقه ها و شامل را در یک خط با دستورالعمل Blade ترکیب کنید
@each
:
@each('view.name', $jobs, 'job')
اولین آرگومان دستورالعمل
@each
، نمایشی است که برای هر عنصر در آرایه یا مجموعه ارائه می شود. آرگومان دوم آرایه یا مجموعه ای است که می خواهید روی آن تکرار کنید، در حالی که آرگومان سوم نام متغیری است که به تکرار فعلی در view اختصاص داده می شود. بنابراین، برای مثال، اگر روی یک آرایه
jobs
از
job
. کلید آرایه برای تکرار فعلی به عنوان
key
متغیر در نما در دسترس خواهد بود.
شما همچنین می توانید یک آرگومان چهارم را به
@each
دستورالعمل منتقل کنید. این آرگومان نمایه ای را تعیین می کند که در صورت خالی بودن آرایه داده شده ارائه می شود.
@each('view.name', $jobs, 'job', 'view.empty')
نماهایی که از طریق ارائه می شوند،
@each
متغیرها را از نمای والد به ارث نمی برند. اگر نمای فرزند به این متغیرها نیاز دارد، باید از دستورات@foreach
و@include
به جای آن استفاده کنید.
بخشنامه
@once
این
@once
دستورالعمل به شما امکان می دهد بخشی از الگو را تعریف کنید که فقط یک بار در هر چرخه رندر ارزیابی می شود. این ممکن است برای فشار دادن یک قطعه معین از جاوا اسکریپت در هدر صفحه با استفاده از
پشته ها
مفید باشد . به عنوان مثال، اگر یک
مؤلفه
معین را در یک حلقه رندر میکنید
، ممکن است بخواهید فقط اولین بار که مؤلفه رندر میشود، جاوا اسکریپت را به سربرگ فشار دهید:
@once @push('scripts') <script> // Your custom JavaScript... </script> @endpush@endonce
از آنجایی که این
@once
دستورالعمل اغلب همراه با
@push
یا
@prepend
دستورالعمل ها استفاده می شود، دستورالعمل های
@pushOnce
و
@prependOnce
برای راحتی شما در دسترس هستند:
@pushOnce('scripts') <script> // Your custom JavaScript... </script>@endPushOnce
PHP خام
در برخی شرایط، جاسازی کد PHP در نماهای خود مفید است. می توانید از
@php
دستور Blade برای اجرای بلوکی از PHP ساده در قالب خود استفاده کنید:
@php $counter = 1;@endphp
یا اگر برای وارد کردن کلاس فقط نیاز به استفاده از PHP دارید، میتوانید از
@use
دستورالعمل زیر استفاده کنید:
@use('App\Models\Flight')
آرگومان دوم ممکن است به
@use
دایرکتیو با نام مستعار کلاس وارداتی ارائه شود:
@use('App\Models\Flight', 'FlightModel')
نظرات
Blade همچنین به شما امکان می دهد نظرات را در نماهای خود تعریف کنید. با این حال، برخلاف نظرات HTML، نظرات Blade در HTML بازگردانده شده توسط برنامه شما گنجانده نشده است:
{{-- This comment will not be present in the rendered HTML --}}
اجزاء
کامپوننت ها و اسلات ها مزایای مشابهی را برای بخش ها، چیدمان ها و شامل: با این حال، برخی ممکن است مدل ذهنی اجزا و شکاف ها را راحت تر درک کنند. دو رویکرد برای نوشتن مؤلفه ها وجود دارد: مؤلفه های مبتنی بر کلاس و مؤلفه های ناشناس.
برای ایجاد یک جزء مبتنی بر کلاس، می توانید از
make:component
دستور Artisan استفاده کنید. برای توضیح نحوه استفاده از کامپوننت ها، یک
Alert
کامپوننت ساده ایجاد می کنیم. دستور
make:component
کامپوننت را در
app/View/Components
دایرکتوری قرار می دهد:
php artisan make:component Alert
این
make:component
دستور همچنین یک view template برای کامپوننت ایجاد می کند. نمای در
resources/views/components
دایرکتوری قرار خواهد گرفت. هنگام نوشتن مؤلفهها برای برنامه خود، مؤلفهها به طور خودکار در
app/View/Components
دایرکتوری و
resources/views/components
دایرکتوری کشف میشوند، بنابراین معمولاً به ثبت مؤلفه دیگری نیاز نیست.
همچنین می توانید اجزایی را در زیر شاخه ها ایجاد کنید:
php artisan make:component Forms/Input
دستور بالا یک
Input
کامپوننت در
app/View/Components/Forms
دایرکتوری ایجاد می کند و view در
resources/views/components/forms
دایرکتوری قرار می گیرد.
اگر می خواهید یک مؤلفه ناشناس ایجاد کنید (یک مؤلفه فقط با یک قالب Blade و بدون کلاس)، می توانید
--view
هنگام فراخوانی
make:component
دستور از پرچم استفاده کنید:
php artisan make:component forms.input --view
دستور بالا یک فایل Blade ایجاد می کند که
resources/views/components/forms/input.blade.php
می تواند به عنوان یک جزء از طریق رندر شود
<x-forms.input />
.
ثبت دستی اجزای بسته
هنگام نوشتن کامپوننت ها برای برنامه خود، اجزا به طور خودکار در
app/View/Components
دایرکتوری و
resources/views/components
دایرکتوری کشف می شوند.
با این حال، اگر در حال ساخت بستهای هستید که از اجزای Blade استفاده میکند، باید کلاس کامپوننت خود و نام مستعار تگ HTML آن را به صورت دستی ثبت کنید. شما معمولاً باید اجزای خود را در
boot
روش ارائه دهنده خدمات بسته خود ثبت کنید:
use Illuminate\Support\Facades\Blade; /** * Bootstrap your package's services. */public function boot(): void{ Blade::component('package-alert', Alert::class);}
هنگامی که کامپوننت شما ثبت شد، ممکن است با استفاده از تگ مستعار آن رندر شود:
<x-package-alert/>
از طرف دیگر، میتوانید از
componentNamespace
روشی برای بارگیری خودکار کلاسهای مؤلفه بر اساس قرارداد استفاده کنید. به عنوان مثال، یک
Nightshade
بسته ممکن است دارای
Calendar
اجزایی باشد
ColorPicker
که در
Package\Views\Components
فضای نام قرار دارند:
use Illuminate\Support\Facades\Blade; /** * Bootstrap your package's services. */public function boot(): void{ Blade::componentNamespace('Nightshade\\Views\\Components', 'nightshade');}
این اجازه می دهد تا از اجزای بسته توسط فضای نام فروشنده آنها با استفاده از نحو استفاده شود
package-name::
:
<x-nightshade::calendar /><x-nightshade::color-picker />
Blade به طور خودکار کلاسی را که به این مؤلفه پیوند داده شده است، با پوشش پاسکال نام مؤلفه شناسایی می کند. زیر شاخه ها نیز با استفاده از نماد "نقطه" پشتیبانی می شوند.
رندر کردن کامپوننت ها
برای نمایش یک کامپوننت، می توانید از یک تگ جزء Blade در یکی از قالب های Blade خود استفاده کنید. تگهای اجزای Blade با رشته شروع میشوند
x-
و به دنبال آن نام کیس کباب کلاس کامپوننت قرار میگیرد:
<x-alert/> <x-user-profile/>
اگر کلاس کامپوننت عمیقتر در
app/View/Components
دایرکتوری تو در تو باشد، میتوانید از
.
کاراکتر برای نشان دادن تودرتوی دایرکتوری استفاده کنید. به عنوان مثال، اگر فرض کنیم که یک کامپوننت در قرار دارد
app/View/Components/Inputs/Button.php
، ممکن است آن را به این صورت ارائه کنیم:
<x-inputs.button/>
اگر می خواهید کامپوننت خود را به صورت مشروط رندر کنید، می توانید
shouldRender
متدی را در کلاس جزء خود تعریف کنید. اگر
shouldRender
متد برگرداند
false
کامپوننت رندر نمی شود:
use Illuminate\Support\Str; /** * Whether the component should be rendered */public function shouldRender(): bool{ return Str::length($this->message) > 0;}
انتقال داده به کامپوننت ها
می توانید داده ها را با استفاده از ویژگی های HTML به اجزای Blade منتقل کنید. مقادیر سخت کد شده و ابتدایی ممکن است با استفاده از رشته های صفت ساده HTML به مؤلفه منتقل شوند. عبارات و متغیرهای PHP باید از طریق ویژگی هایی که از
:
کاراکتر به عنوان پیشوند
استفاده می کنند به کامپوننت منتقل شوند :
<x-alert type="error" :message="$message"/>
شما باید تمام ویژگی های داده کامپوننت را در سازنده کلاس آن تعریف کنید. تمام خصوصیات عمومی یک مؤلفه به طور خودکار در معرض دید مؤلفه قرار می گیرد. لازم نیست داده ها را از
render
متد کامپوننت به view ارسال کنید:
<?php namespace App\View\Components; use Illuminate\View\Component;use Illuminate\View\View; class Alert extends Component{ /** * Create the component instance. */ public function __construct( public string $type, public string $message, ) {} /** * Get the view / contents that represent the component. */ public function render(): View { return view('components.alert'); }}
وقتی کامپوننت شما رندر میشود، میتوانید محتوای متغیرهای عمومی جزء خود را با تکرار نام متغیرها نمایش دهید:
<div class="alert alert-{{ $type }}"> {{ $message }}</div>
پوشش
آرگومان های سازنده کامپوننت باید با استفاده از مشخص شوند
camelCase
، در حالی که
kebab-case
باید هنگام ارجاع نام آرگومان ها در ویژگی های HTML شما استفاده شوند. به عنوان مثال، با توجه به سازنده کامپوننت زیر:
/** * Create the component instance. */public function __construct( public string $alertType,) {}
آرگومان
$alertType
ممکن است به این مولفه ارائه شود:
<x-alert alert-type="danger" />
نحو مشخصه کوتاه
هنگام انتقال صفات به مؤلفهها، میتوانید از نحو «ویژگی کوتاه» نیز استفاده کنید. این اغلب راحت است زیرا نام ویژگی ها اغلب با نام متغیرهایی که مطابقت دارند مطابقت دارند:
{{-- Short attribute syntax... --}}<x-profile :$userId :$name /> {{-- Is equivalent to... --}}<x-profile :user-id="$userId" :name="$name" />
فرار از ارائه ویژگی
از آنجایی که برخی از فریم ورکهای جاوا اسکریپت مانند Alpine.js نیز از ویژگیهای با پیشوند کولون استفاده میکنند، میتوانید از
::
پیشوند دو کولون ( ) برای اطلاع به Blade استفاده کنید که این ویژگی یک عبارت PHP نیست. به عنوان مثال، با توجه به مولفه زیر:
<x-button ::class="{ danger: isDeleting }"> Submit</x-button>
HTML زیر توسط Blade ارائه می شود:
<button :class="{ danger: isDeleting }"> Submit</button>
روش های جزء
علاوه بر اینکه متغیرهای عمومی در قالب کامپوننت شما در دسترس هستند، ممکن است از هر روش عمومی روی کامپوننت فراخوانی شود. برای مثال، کامپوننتی را تصور کنید که دارای یک
isSelected
متد است:
/** * Determine if the given option is the currently selected option. */public function isSelected(string $option): bool{ return $option === $this->selected;}
شما می توانید این متد را از قالب جزء خود با فراخوانی متغیری که با نام متد مطابقت دارد اجرا کنید:
<option {{ $isSelected($value) ? 'selected' : '' }} value="{{ $value }}"> {{ $label }}</option>
دسترسی به ویژگیها و شکافها در کلاسهای مؤلفه
اجزای Blade همچنین به شما این امکان را می دهند که به نام مؤلفه، ویژگی ها و شکاف در متد رندر کلاس دسترسی داشته باشید. با این حال، برای دسترسی به این دادهها، باید یک بسته از
render
متد جزء خود را برگردانید. بسته شدن
$data
آرایه ای را به عنوان تنها آرگومان خود دریافت می کند. این آرایه حاوی چندین عنصر خواهد بود که اطلاعاتی در مورد کامپوننت ارائه می دهد:
use Closure; /** * Get the view / contents that represent the component. */public function render(): Closure{ return function (array $data) { // $data['componentName']; // $data['attributes']; // $data['slot']; return '<div>Components content</div>'; };}
برابر
componentName
با نام استفاده شده در تگ HTML بعد از
x-
پیشوند است. همینطور
<x-alert />
خواهد
componentName
بود
alert
. این
attributes
عنصر حاوی تمام ویژگی هایی است که در تگ HTML وجود دارد. عنصر
slot
یک
Illuminate\Support\HtmlString
نمونه با محتویات شکاف جزء است.
بسته شدن باید یک رشته را برگرداند. اگر رشته برگشتی با یک نمای موجود مطابقت داشته باشد، آن نمای ارائه می شود. در غیر این صورت، رشته برگشتی به عنوان نمای Blade درون خطی ارزیابی می شود.
وابستگی های اضافی
اگر کامپوننت شما به وابستگی هایی از ظرف سرویس لاراول نیاز دارد ، می توانید آنها را قبل از هر یک از ویژگی های داده کامپوننت لیست کنید و به طور خودکار توسط ظرف تزریق می شوند:
use App\Services\AlertCreator; /** * Create the component instance. */public function __construct( public AlertCreator $creator, public string $type, public string $message,) {}
پنهان کردن ویژگی ها / روش ها
اگر می خواهید از قرار گرفتن برخی از متدها یا ویژگی های عمومی به عنوان متغیر در قالب کامپوننت خود جلوگیری کنید، می توانید آنها را به یک
$except
ویژگی آرایه در مؤلفه خود اضافه کنید:
<?php namespace App\View\Components; use Illuminate\View\Component; class Alert extends Component{ /** * The properties / methods that should not be exposed to the component template. * * @var array */ protected $except = ['type']; /** * Create the component instance. */ public function __construct( public string $type, ) {}}
ویژگی های مؤلفه
ما قبلا نحوه انتقال ویژگی های داده به یک جزء را بررسی کرده ایم. با این حال، گاهی اوقات ممکن است لازم باشد ویژگی های اضافی HTML مانند ,
class
که بخشی از داده های مورد نیاز برای عملکرد یک جزء نیستند را مشخص کنید. به طور معمول، شما می خواهید این ویژگی های اضافی را به عنصر ریشه قالب کامپوننت منتقل کنید. به عنوان مثال، تصور کنید که می خواهیم یک
alert
کامپوننت را مانند این رندر کنیم:
<x-alert type="error" :message="$message" class="mt-4"/>
تمام ویژگی هایی که بخشی از سازنده کامپوننت نیستند به طور خودکار به "کیسه ویژگی" کامپوننت اضافه می شوند. این کیسه ویژگی به طور خودکار از طریق متغیر در اختیار مؤلفه قرار می گیرد
$attributes
. همه صفات ممکن است با تکرار این متغیر در کامپوننت ارائه شوند:
<div {{ $attributes }}> <!-- Component content --></div>
استفاده از دستورالعملهایی مانند
@env
درون تگهای مؤلفه در حال حاضر پشتیبانی نمیشود. به عنوان مثال،<x-alert :live="@env('production')"/>
کامپایل نخواهد شد.
ویژگی های پیش فرض / ادغام شده
گاهی اوقات ممکن است لازم باشد مقادیر پیش فرض را برای ویژگی ها مشخص کنید یا مقادیر اضافی را در برخی از ویژگی های مؤلفه ادغام کنید. برای انجام این کار، می توانید از روش کیف ویژگی استفاده کنید
merge
. این روش به ویژه برای تعریف مجموعهای از کلاسهای پیشفرض CSS که همیشه باید برای یک جزء اعمال شوند مفید است:
<div {{ $attributes->merge(['class' => 'alert alert-'.$type]) }}> {{ $message }}</div>
اگر فرض کنیم این مؤلفه به این صورت استفاده می شود:
<x-alert type="error" :message="$message" class="mb-4"/>
HTML نهایی و رندر شده کامپوننت به شکل زیر ظاهر می شود:
<div class="alert alert-error mb-4"> <!-- Contents of the $message variable --></div>
ادغام مشروط کلاسها
گاهی اوقات ممکن است بخواهید کلاس ها را ادغام کنید اگر یک شرط مشخص باشد
true
. شما می توانید این کار را از طریق
class
متد انجام دهید، که آرایه ای از کلاس ها را می پذیرد که در آن کلید آرایه شامل کلاس یا کلاس هایی است که می خواهید اضافه کنید، در حالی که مقدار یک عبارت بولی است. اگر عنصر آرایه دارای یک کلید عددی باشد، همیشه در لیست کلاس رندر شده قرار می گیرد:
<div {{ $attributes->class(['p-4', 'bg-red' => $hasError]) }}> {{ $message }}</div>
اگر نیاز به ادغام سایر ویژگیها در مؤلفه خود دارید، میتوانید
merge
متد را به
class
متد زنجیرهای کنید:
<button {{ $attributes->class(['p-4'])->merge(['type' => 'button']) }}> {{ $slot }}</button>
اگر نیاز به کامپایل کردن کلاسهای مشروط روی سایر عناصر HTML دارید که نباید ویژگیهای ادغام شده را دریافت کنند، میتوانید از
@class
دستورالعمل استفاده کنید .
ادغام صفات غیر کلاسی
هنگام ادغام ویژگی هایی که ویژگی نیستند
class
، مقادیر ارائه شده به
merge
روش، مقادیر "پیش فرض" ویژگی در نظر گرفته می شوند. با این حال، بر خلاف
class
ویژگی، این ویژگی ها با مقادیر ویژگی تزریق شده ادغام نمی شوند. در عوض، آنها رونویسی خواهند شد. برای مثال،
button
اجرای یک جزء ممکن است به شکل زیر باشد:
<button {{ $attributes->merge(['type' => 'button']) }}> {{ $slot }}</button>
برای رندر کردن مؤلفه دکمه با یک سفارشی
type
، ممکن است هنگام مصرف مؤلفه مشخص شود. اگر نوع مشخص نشده باشد، از
button
نوع استفاده می شود:
<x-button type="submit"> Submit</x-button>
HTML رندر شده کامپوننت
button
در این مثال به صورت زیر خواهد بود:
<button type="submit"> Submit</button>
اگر میخواهید ویژگی دیگری غیر از اینکه
class
مقدار پیشفرض و مقادیر تزریقشده به هم متصل شوند، میتوانید از این
prepends
روش استفاده کنید. در این مثال،
data-controller
ویژگی همیشه با شروع خواهد شد
profile-controller
و هر
data-controller
مقدار اضافی تزریق شده بعد از این مقدار پیش فرض قرار می گیرد:
<div {{ $attributes->merge(['data-controller' => $attributes->prepends('profile-controller')]) }}> {{ $slot }}</div>
بازیابی و فیلتر کردن ویژگی ها
می توانید با استفاده از
filter
روش، ویژگی ها را فیلتر کنید. این روش بسته شدنی را میپذیرد که
true
اگر بخواهید ویژگی را در کیسه ویژگی حفظ کنید، باید بازگردد:
{{ $attributes->filter(fn (string $value, string $key) => $key == 'foo') }}
برای راحتی، میتوانید از
whereStartsWith
روش برای بازیابی همه ویژگیهایی که کلیدهای آنها با یک رشته مشخص شروع میشود استفاده کنید:
{{ $attributes->whereStartsWith('wire:model') }}
برعکس، این
whereDoesntStartWith
روش ممکن است برای حذف تمام ویژگی هایی که کلیدهای آنها با یک رشته مشخص شروع می شود استفاده شود:
{{ $attributes->whereDoesntStartWith('wire:model') }}
با استفاده از
first
روش، می توانید اولین ویژگی را در یک کیسه مشخصه ارائه دهید:
{{ $attributes->whereStartsWith('wire:model')->first() }}
اگر می خواهید بررسی کنید که آیا یک ویژگی در مؤلفه وجود دارد، می توانید از
has
روش استفاده کنید. این متد نام ویژگی را به عنوان تنها آرگومان خود می پذیرد و یک بولی نشان می دهد که آیا ویژگی وجود دارد یا نه:
@if ($attributes->has('class')) <div>Class attribute is present</div>@endif
اگر یک آرایه به متد ارسال شود
has
، متد تعیین میکند که آیا همه ویژگیهای دادهشده در مولفه وجود دارند یا خیر:
@if ($attributes->has(['name', 'class'])) <div>All of the attributes are present</div>@endif
این
hasAny
روش ممکن است برای تعیین اینکه آیا هر یک از ویژگی های داده شده در مؤلفه وجود دارد یا خیر استفاده شود:
@if ($attributes->hasAny(['href', ':href', 'v-bind:href'])) <div>One of the attributes is present</div>@endif
می توانید مقدار یک ویژگی خاص را با استفاده از
get
روش بازیابی کنید:
{{ $attributes->get('class') }}
کلمات کلیدی رزرو شده
بهطور پیشفرض، برخی از کلیدواژهها برای استفاده داخلی Blade برای رندر کردن مؤلفهها رزرو شدهاند. کلمات کلیدی زیر را نمی توان به عنوان ویژگی های عمومی یا نام روش در اجزای شما تعریف کرد:
-
data
-
render
-
resolveView
-
shouldRender
-
view
-
withAttributes
-
withName
شکاف ها
شما اغلب نیاز دارید که محتوای اضافی را از طریق «اسلات» به مؤلفه خود منتقل کنید. شکاف های مؤلفه با تکرار
$slot
متغیر ارائه می شوند. برای کشف این مفهوم، بیایید تصور کنیم که یک
alert
جزء دارای نشانه گذاری زیر است:
<!-- /resources/views/components/alert.blade.php --> <div class="alert alert-danger"> {{ $slot }}</div>
slot
ممکن است با تزریق
محتوا به مؤلفه، محتوا را به آن منتقل کنیم :
<x-alert> <strong>Whoops!</strong> Something went wrong!</x-alert>
گاهی اوقات ممکن است یک کامپوننت نیاز داشته باشد که چندین اسلات مختلف را در مکان های مختلف درون کامپوننت ارائه دهد. بیایید مؤلفه هشدار خود را تغییر دهیم تا امکان تزریق یک اسلات "عنوان" را فراهم کنیم:
<!-- /resources/views/components/alert.blade.php --> <span class="alert-title">{{ $title }}</span> <div class="alert alert-danger"> {{ $slot }}</div>
می توانید محتوای اسلات نامگذاری شده را با استفاده از
x-slot
تگ تعریف کنید. هر محتوایی که در یک
x-slot
تگ صریح نباشد به مؤلفه موجود در
$slot
متغیر منتقل می شود:
<x-alert> <x-slot:title> Server Error </x-slot> <strong>Whoops!</strong> Something went wrong!</x-alert>
isEmpty
برای تعیین اینکه آیا اسلات حاوی محتوا است یا خیر،
میتوانید از روش یک اسلات استفاده کنید :
<span class="alert-title">{{ $title }}</span> <div class="alert alert-danger"> @if ($slot->isEmpty()) This is default content if the slot is empty. @else {{ $slot }} @endif</div>
علاوه بر این، این
hasActualContent
روش ممکن است برای تعیین اینکه آیا اسلات حاوی محتوای "واقعی" است که یک نظر HTML نیست استفاده شود:
@if ($slot->hasActualContent()) The scope has non-comment content.@endif
اسلات های محدوده
اگر از یک چارچوب جاوا اسکریپت مانند Vue استفاده کردهاید، ممکن است با «اسلاتهای scoped» آشنا باشید که به شما امکان میدهد به دادهها یا روشهایی از مؤلفه درون اسلات خود دسترسی داشته باشید. شما میتوانید با تعریف متدها یا ویژگیهای عمومی در کامپوننت خود و دسترسی به کامپوننت در اسلات خود از طریق
$component
متغیر، رفتار مشابهی را در لاراول به دست آورید. در این مثال، فرض میکنیم که
x-alert
کامپوننت دارای یک
formatAlert
متد عمومی است که روی کلاس جزء آن تعریف شده است:
<x-alert> <x-slot:title> {{ $component->formatAlert('Server Error') }} </x-slot> <strong>Whoops!</strong> Something went wrong!</x-alert>
ویژگی های اسلات
مانند اجزای Blade، میتوانید ویژگیهای اضافی مانند نام کلاسهای CSS را به اسلاتها اختصاص دهید:
<x-card class="shadow-sm"> <x-slot:heading class="font-bold"> Heading </x-slot> Content <x-slot:footer class="text-sm"> Footer </x-slot></x-card>
برای تعامل با ویژگی های اسلات، می توانید به
attributes
ویژگی متغیر اسلات دسترسی پیدا کنید. برای اطلاعات بیشتر در مورد نحوه تعامل با ویژگیها، لطفاً به مستندات مربوط به
ویژگیهای مؤلفه
مراجعه کنید :
@props([ 'heading', 'footer',]) <div {{ $attributes->class(['border']) }}> <h1 {{ $heading->attributes->class(['text-lg']) }}> {{ $heading }} </h1> {{ $slot }} <footer {{ $footer->attributes->class(['text-gray-700']) }}> {{ $footer }} </footer></div>
نماهای اجزای درون خطی
برای کامپوننت های بسیار کوچک، ممکن است مدیریت هر دو کلاس کامپوننت و نمایش الگوی کامپوننت سخت باشد. به همین دلیل، میتوانید نشانهگذاری مؤلفه را مستقیماً از
render
روش برگردانید:
/** * Get the view / contents that represent the component. */public function render(): string{ return <<<'blade' <div class="alert alert-danger"> {{ $slot }} </div> blade;}
تولید اجزای نمای درون خطی
برای ایجاد کامپوننتی که نمای درون خطی را ارائه می دهد، می توانید
inline
هنگام اجرای
make:component
دستور از این گزینه استفاده کنید:
php artisan make:component Alert --inline
اجزای دینامیک
گاهی اوقات ممکن است لازم باشد یک کامپوننت را رندر کنید اما ندانید کدام کامپوننت باید تا زمان اجرا رندر شود. در این شرایط، می توانید از کامپوننت داخلی لاراول
dynamic-component
برای رندر کامپوننت بر اساس مقدار زمان اجرا یا متغیر استفاده کنید:
// $componentName = "secondary-button"; <x-dynamic-component :component="$componentName" class="mt-4" />
ثبت دستی کامپوننت ها
مستندات زیر در مورد ثبت دستی کامپوننت ها در درجه اول برای کسانی که در حال نوشتن بسته های لاراول هستند که شامل کامپوننت های view هستند، کاربرد دارد. اگر در حال نوشتن یک بسته نیستید، این بخش از مستندات مؤلفه ممکن است به شما مربوط نباشد.
هنگام نوشتن کامپوننت ها برای برنامه خود، اجزا به طور خودکار در
app/View/Components
دایرکتوری و
resources/views/components
دایرکتوری کشف می شوند.
با این حال، اگر در حال ساخت بستهای هستید که از اجزای Blade استفاده میکند یا کامپوننتها را در دایرکتوریهای غیر متعارف قرار میدهد، باید کلاس کامپوننت خود و نام مستعار تگ HTML آن را بهطور دستی ثبت کنید تا لاراول بداند کامپوننت را کجا پیدا کند. شما معمولاً باید اجزای خود را در
boot
روش ارائه دهنده خدمات بسته خود ثبت کنید:
use Illuminate\Support\Facades\Blade;use VendorPackage\View\Components\AlertComponent; /** * Bootstrap your package's services. */public function boot(): void{ Blade::component('package-alert', AlertComponent::class);}
هنگامی که کامپوننت شما ثبت شد، ممکن است با استفاده از تگ مستعار آن رندر شود:
<x-package-alert/>
بارگیری خودکار اجزای بسته
از طرف دیگر، میتوانید از
componentNamespace
روشی برای بارگیری خودکار کلاسهای مؤلفه بر اساس قرارداد استفاده کنید. به عنوان مثال، یک
Nightshade
بسته ممکن است دارای
Calendar
اجزایی باشد
ColorPicker
که در
Package\Views\Components
فضای نام قرار دارند:
use Illuminate\Support\Facades\Blade; /** * Bootstrap your package's services. */public function boot(): void{ Blade::componentNamespace('Nightshade\\Views\\Components', 'nightshade');}
این اجازه می دهد تا از اجزای بسته توسط فضای نام فروشنده آنها با استفاده از نحو استفاده شود
package-name::
:
<x-nightshade::calendar /><x-nightshade::color-picker />
Blade به طور خودکار کلاسی را که به این مؤلفه پیوند داده شده است، با پوشش پاسکال نام مؤلفه شناسایی می کند. زیر شاخه ها نیز با استفاده از نماد "نقطه" پشتیبانی می شوند.
اجزای ناشناس
مشابه اجزای درون خطی، کامپوننت های ناشناس مکانیزمی برای مدیریت یک جزء از طریق یک فایل واحد ارائه می دهند. با این حال، اجزای ناشناس از یک فایل مشاهده استفاده می کنند و هیچ کلاس مرتبطی ندارند. برای تعریف یک مؤلفه ناشناس، فقط باید یک قالب Blade را در
resources/views/components
فهرست خود قرار دهید. به عنوان مثال، با فرض اینکه یک کامپوننت را در تعریف کرده اید
resources/views/components/alert.blade.php
، می توانید به سادگی آن را به این صورت ارائه کنید:
<x-alert/>
شما میتوانید از این
.
کاراکتر برای نشان دادن اینکه آیا یک جزء در عمق دایرکتوری تودرتو شده است استفاده کنید
components
. به عنوان مثال، با فرض اینکه کامپوننت در تعریف شده است
resources/views/components/inputs/button.blade.php
، می توانید آن را به این صورت ارائه کنید:
<x-inputs.button/>
اجزای شاخص ناشناس
گاهی اوقات، زمانی که یک جزء از چندین الگوی Blade تشکیل شده است، ممکن است بخواهید الگوهای کامپوننت داده شده را در یک فهرست واحد گروه بندی کنید. برای مثال، یک جزء "آکاردئون" را با ساختار دایرکتوری زیر تصور کنید:
/resources/views/components/accordion.blade.php/resources/views/components/accordion/item.blade.php
این ساختار دایرکتوری به شما این امکان را می دهد که مولفه آکاردئون و آیتم آن را به صورت زیر ارائه کنید:
<x-accordion> <x-accordion.item> ... </x-accordion.item></x-accordion>
با این حال، برای اینکه مولفه آکاردئون را از طریق رندر کنیم
x-accordion
، مجبور شدیم الگوی مؤلفه آکاردئون «شاخص» را
resources/views/components
به جای تودرتو کردن آن در دایرکتوری
accordion
با سایر الگوهای مرتبط با آکاردئون در فهرست قرار دهیم.
خوشبختانه، Blade به شما اجازه می دهد تا یک
index.blade.php
فایل را در پوشه قالب یک جزء قرار دهید. هنگامی که یک
index.blade.php
الگو برای کامپوننت وجود دارد، به عنوان گره "ریشه" کامپوننت ارائه می شود. بنابراین، میتوانیم از همان نحو Blade استفاده کنیم که در مثال بالا آمده است. با این حال، ساختار دایرکتوری خود را به این صورت تنظیم می کنیم:
/resources/views/components/accordion/index.blade.php/resources/views/components/accordion/item.blade.php
ویژگی ها / ویژگی های داده
از آنجایی که مؤلفههای ناشناس هیچ کلاس مرتبطی ندارند، ممکن است تعجب کنید که چگونه میتوانید تشخیص دهید که کدام داده باید به عنوان متغیر به مؤلفه منتقل شود و کدام ویژگی باید در کیف ویژگی مؤلفه قرار گیرد .
میتوانید با استفاده از
@props
دستورالعمل موجود در بالای قالب Blade، مشخص کنید که کدام ویژگی باید به عنوان متغیر داده در نظر گرفته شود. تمام ویژگیهای دیگر روی کامپوننت از طریق کیف ویژگی کامپوننت در دسترس خواهد بود. اگر می خواهید به یک متغیر داده مقدار پیش فرض بدهید، می توانید نام متغیر را به عنوان کلید آرایه و مقدار پیش فرض را به عنوان مقدار آرایه مشخص کنید:
<!-- /resources/views/components/alert.blade.php --> @props(['type' => 'info', 'message']) <div {{ $attributes->merge(['class' => 'alert alert-'.$type]) }}> {{ $message }}</div>
با توجه به تعریف کامپوننت در بالا، ممکن است کامپوننت را اینگونه بیان کنیم:
<x-alert type="error" :message="$message" class="mb-4"/>
دسترسی به داده های والدین
گاهی اوقات ممکن است بخواهید به دادههای یک مؤلفه والد در داخل مؤلفه فرزند دسترسی داشته باشید. در این موارد، می توانید از
@aware
دستورالعمل استفاده کنید. به عنوان مثال، تصور کنید ما در حال ساختن یک جزء منوی پیچیده متشکل از والدین
<x-menu>
و فرزند هستیم
<x-menu.item>
:
<x-menu color="purple"> <x-menu.item>...</x-menu.item> <x-menu.item>...</x-menu.item></x-menu>
کامپوننت
<x-menu>
ممکن است پیاده سازی مانند زیر داشته باشد:
<!-- /resources/views/components/menu/index.blade.php --> @props(['color' => 'gray']) <ul {{ $attributes->merge(['class' => 'bg-'.$color.'-200']) }}> {{ $slot }}</ul>
از آنجا که
color
پایه فقط به والد (
<x-menu>
) منتقل شده است، در داخل در دسترس نخواهد بود
<x-menu.item>
. با این حال، اگر از دستورالعمل استفاده کنیم
@aware
، می توانیم آن را در داخل
<x-menu.item>
نیز در دسترس قرار دهیم:
<!-- /resources/views/components/menu/item.blade.php --> @aware(['color' => 'gray']) <li {{ $attributes->merge(['class' => 'text-'.$color.'-800']) }}> {{ $slot }}</li>
دستورالعمل
@aware
نمی تواند به داده های والد که به طور صریح از طریق ویژگی های HTML به مؤلفه والد منتقل نشده اند دسترسی پیدا کند. مقادیر پیشفرض@props
که به صراحت به مؤلفه والد منتقل نمیشوند توسط دستورالعمل قابل دسترسی نیستند@aware
.
مسیرهای مؤلفه ناشناس
همانطور که قبلا بحث شد، اجزای ناشناس معمولا با قرار دادن یک قالب Blade در
resources/views/components
فهرست شما تعریف می شوند. با این حال، ممکن است گاهی بخواهید علاوه بر مسیر پیش فرض، مسیرهای مؤلفه ناشناس دیگری را با لاراول ثبت کنید.
این
anonymousComponentPath
متد «مسیر» به مکان مؤلفه ناشناس را بهعنوان آرگومان اول و «فضای نام» اختیاری را میپذیرد که اجزا باید بهعنوان آرگومان دوم در آن قرار گیرند. به طور معمول، این روش باید از روش یکی از
ارائه دهندگان خدمات
boot
برنامه شما
فراخوانی شود
:
/** * Bootstrap any application services. */public function boot(): void{ Blade::anonymousComponentPath(__DIR__.'/../components');}
هنگامی که مسیرهای کامپوننت بدون پیشوند مشخصی مانند مثال بالا ثبت می شوند، ممکن است در اجزای Blade شما نیز بدون پیشوند مربوطه ارائه شوند. برای مثال، اگر
panel.blade.php
کامپوننتی در مسیر ثبت شده در بالا وجود داشته باشد، ممکن است به صورت زیر نمایش داده شود:
<x-panel />
پیشوند "namespace" ممکن است به عنوان آرگومان دوم متد ارائه شود
anonymousComponentPath
:
Blade::anonymousComponentPath(__DIR__.'/../components', 'dashboard');
هنگامی که یک پیشوند ارائه می شود، اجزای موجود در آن "Namspace" ممکن است با پیشوند فضای نام کامپوننت به نام کامپوننت هنگام رندر شدن کامپوننت ارائه شوند:
<x-dashboard::panel />
چیدمان ساختمان
طرح بندی با استفاده از کامپوننت ها
اکثر برنامه های کاربردی وب یک طرح کلی را در صفحات مختلف حفظ می کنند. اگر بخواهیم کل طرح بندی HTML را در هر نمایی که ایجاد می کنیم تکرار کنیم، نگهداری برنامه فوق العاده دست و پا گیر و سخت خواهد بود. خوشبختانه، راحت است که این طرح را به عنوان یک جزء Blade تعریف کنیم و سپس از آن در سراسر برنامه خود استفاده کنیم.
تعریف مولفه Layout
به عنوان مثال، تصور کنید که در حال ساخت یک برنامه لیست "todo" هستیم. ممکن است
layout
کامپوننتی را به شکل زیر
تعریف کنیم :
<!-- resources/views/components/layout.blade.php --> <html> <head> <title>{{ $title ?? 'Todo Manager' }}</title> </head> <body> <h1>Todos</h1> <hr/> {{ $slot }} </body></html>
اعمال مولفه Layout
هنگامی که
layout
کامپوننت تعریف شد، ممکن است یک نمای Blade ایجاد کنیم که از کامپوننت استفاده می کند. در این مثال، یک نمای ساده تعریف می کنیم که لیست وظایف ما را نمایش می دهد:
<!-- resources/views/tasks.blade.php --> <x-layout> @foreach ($tasks as $task) {{ $task }} @endforeach</x-layout>
$slot
به یاد داشته باشید، محتوایی که به یک کامپوننت تزریق میشود، به متغیر پیشفرض درون
layout
کامپوننت ما
عرضه میشود .
همانطور که ممکن است متوجه شده باشید، ما
layout
نیز
$title
در صورت ارائه به یک شکاف احترام می گذاریم. در غیر این صورت یک عنوان پیش فرض نشان داده می شود. ما ممکن است یک عنوان سفارشی را از نمای لیست وظایف خود با استفاده از نحو استاندارد اسلات که در
مستندات مؤلفه
بحث شده است، تزریق کنیم :
<!-- resources/views/tasks.blade.php --> <x-layout> <x-slot:title> Custom Title </x-slot> @foreach ($tasks as $task) {{ $task }} @endforeach</x-layout>
task
اکنون که نماهای چیدمان و لیست وظایف خود را تعریف کرده ایم، فقط باید نمای را از یک مسیر
برگردانیم :
use App\Models\Task; Route::get('/tasks', function () { return view('tasks', ['tasks' => Task::all()]);});
طرحبندی با استفاده از وراثت الگو
تعریف Layout
طرحبندیها همچنین ممکن است از طریق «ارث بری قالب» ایجاد شوند. این روش اولیه ساخت برنامه های کاربردی قبل از معرفی کامپوننت ها بود .
برای شروع، اجازه دهید نگاهی به یک مثال ساده بیاندازیم. ابتدا یک صفحه آرایی را بررسی می کنیم. از آنجایی که اکثر برنامه های کاربردی وب یک طرح کلی را در صفحات مختلف حفظ می کنند، تعریف این طرح به عنوان یک نمای Blade راحت است:
<!-- resources/views/layouts/app.blade.php --> <html> <head> <title>App Name - @yield('title')</title> </head> <body> @section('sidebar') This is the master sidebar. @show <div class="container"> @yield('content') </div> </body></html>
همانطور که می بینید، این فایل حاوی نشانه گذاری معمولی HTML است. با این حال، دستورالعمل ها
@section
و
@yield
دستورالعمل ها را مورد توجه قرار دهید. دستورالعمل
@section
، همانطور که از نام آن پیداست، بخشی از محتوا را تعریف می کند، در حالی که
@yield
دستورالعمل برای نمایش محتوای یک بخش خاص استفاده می شود.
اکنون که یک طرح بندی برای برنامه خود تعریف کرده ایم، بیایید یک صفحه فرزند تعریف کنیم که layout را به ارث می برد.
گسترش یک طرح
هنگام تعریف نمای فرزند، از
@extends
دستورالعمل Blade استفاده کنید تا مشخص کنید نمای فرزند باید چه طرحی را به ارث ببرد. نماهایی که طرحبندی Blade را گسترش میدهند، ممکن است با استفاده از
@section
دستورالعملها، محتوا را به بخشهای طرحبندی تزریق کنند. به یاد داشته باشید، همانطور که در مثال بالا مشاهده می شود، محتویات این بخش ها در طرح بندی با استفاده از
@yield
:
<!-- resources/views/child.blade.php --> @extends('layouts.app') @section('title', 'Page Title') @section('sidebar') @parent <p>This is appended to the master sidebar.</p>@endsection @section('content') <p>This is my body content.</p>@endsection
در این مثال، بخش
از دستورالعمل برای الحاق (به جای بازنویسی) محتوا به نوار کناری طرحبندی
sidebar
استفاده میکند . هنگامی که نما ارائه می شود،
@parent
دستورالعمل
@parent
با محتوای طرح جایگزین می شود.
برخلاف مثال قبلی، این
sidebar
بخش به@endsection
جای@show
. دستورالعمل@endsection
فقط یک بخش را تعریف می کند در حالی که آن بخش@show
را تعریف می کند و بلافاصله ارائه می دهد .
دستورالعمل
@yield
همچنین یک مقدار پیش فرض را به عنوان پارامتر دوم خود می پذیرد. این مقدار در صورتی نمایش داده میشود که بخش ارائهشده تعریف نشده باشد:
@yield('content', 'Default content')
تشکیل می دهد
فیلد CSRF
هر زمان که یک فرم HTML را در برنامه خود تعریف می کنید، باید یک فیلد رمز پنهان CSRF را در فرم قرار دهید تا میان افزار
حفاظت CSRF
بتواند درخواست را تأیید کند. می توانید از
@csrf
دستورالعمل Blade برای تولید فیلد نشانه استفاده کنید:
<form method="POST" action="/profile"> @csrf ...</form>
فیلد روش
از آنجایی که فرمهای HTML نمیتوانند، یا درخواست ایجاد
PUT
کنند
PATCH
،
DELETE
باید یک
_method
فیلد مخفی برای جعل این افعال HTTP اضافه کنید. دستورالعمل
@method
Blade می تواند این فیلد را برای شما ایجاد کند:
<form action="/foo/bar" method="POST"> @method('PUT') ...</form>
خطاهای اعتبارسنجی
این
@error
دستورالعمل ممکن است برای بررسی سریع وجود
پیام های خطای اعتبارسنجی
برای یک ویژگی خاص استفاده شود. در یک
@error
دستورالعمل، می توانید
$message
متغیر را برای نمایش پیام خطا تکرار کنید:
<!-- /resources/views/post/create.blade.php --> <label for="title">Post Title</label> <input id="title" type="text" class="@error('title') is-invalid @enderror"> @error('title') <div class="alert alert-danger">{{ $message }}</div>@enderror
از آنجایی که
@error
دستورالعمل به یک عبارت "if" کامپایل می شود، می توانید از
@else
دستورالعمل برای ارائه محتوا در زمانی که خطایی برای یک ویژگی وجود ندارد استفاده کنید:
<!-- /resources/views/auth.blade.php --> <label for="email">Email address</label> <input id="email" type="email" class="@error('email') is-invalid @else is-valid @enderror">
میتوانید
نام یک کیسه خطای خاص را
بهعنوان پارامتر دوم
@error
برای بازیابی پیامهای خطای اعتبارسنجی در صفحات حاوی چندین فرم به دستورالعمل ارسال کنید:
<!-- /resources/views/auth.blade.php --> <label for="email">Email address</label> <input id="email" type="email" class="@error('email', 'login') is-invalid @enderror"> @error('email', 'login') <div class="alert alert-danger">{{ $message }}</div>@enderror
پشته ها
Blade به شما امکان می دهد تا به پشته های نامگذاری شده فشار دهید که می توانند در جای دیگری در نمای یا طرح بندی دیگر ارائه شوند. این می تواند به ویژه برای تعیین هر گونه کتابخانه جاوا اسکریپت مورد نیاز برای بازدیدهای فرزند شما مفید باشد:
@push('scripts') <script src="/example.js"></script>@endpush
اگر میخواهید
@push
در صورتی که یک عبارت بولی داده شده را به ارزیابی میکند محتوا کنید
true
، میتوانید از
@pushIf
دستورالعمل استفاده کنید:
@pushIf($shouldPush, 'scripts') <script src="/example.js"></script>@endPushIf
می توانید هر چند بار که لازم است به پشته فشار دهید. برای رندر کردن محتویات کامل پشته، نام پشته را به
@stack
دستورالعمل ارسال کنید:
<head> <!-- Head Contents --> @stack('scripts')</head>
اگر می خواهید محتوا را در ابتدای یک پشته قرار دهید، باید از
@prepend
دستورالعمل استفاده کنید:
@push('scripts') This will be second...@endpush // Later... @prepend('scripts') This will be first...@endprepend
تزریق خدمات
این دستورالعمل ممکن است برای بازیابی یک سرویس از
ظرف سرویس
@inject
لاراول استفاده شود
. اولین آرگومان ارسال شده به
نام متغیری است که سرویس در آن قرار می گیرد، در حالی که آرگومان دوم کلاس یا نام رابط سرویسی است که می خواهید آن را حل کنید:
@inject
@inject('metrics', 'App\Services\MetricsService') <div> Monthly Revenue: {{ $metrics->monthlyRevenue() }}.</div>
رندر کردن قالب های تیغه درون خطی
گاهی اوقات ممکن است لازم باشد یک رشته قالب خام Blade را به HTML معتبر تبدیل کنید. شما می توانید این کار را با استفاده از
render
روش ارائه شده توسط
Blade
نما انجام دهید. این
render
روش رشته الگوی Blade و یک آرایه اختیاری از داده ها را برای ارائه به الگو می پذیرد:
use Illuminate\Support\Facades\Blade; return Blade::render('Hello, {{ $name }}', ['name' => 'Julian Bashir']);
لاراول قالب های Blade درون خطی را با نوشتن آنها در
storage/framework/views
دایرکتوری رندر می کند. اگر می خواهید لاراول این فایل های موقت را پس از رندر کردن قالب Blade حذف کند، می توانید آرگومان
deleteCachedView
متد را ارائه دهید:
return Blade::render( 'Hello, {{ $name }}', ['name' => 'Julian Bashir'], deleteCachedView: true);
رندر قطعات تیغه
هنگام استفاده از فریمورکهای فرانتاند مانند
Turbo
و
htmx
، ممکن است گاهی لازم باشد فقط بخشی از قالب Blade را در پاسخ HTTP خود برگردانید. "قطعات" تیغه به شما این امکان را می دهد که این کار را انجام دهید. برای شروع، بخشی از قالب Blade خود را در داخل
@fragment
و
@endfragment
دستورالعمل ها قرار دهید:
@fragment('user-list') <ul> @foreach ($users as $user) <li>{{ $user->name }}</li> @endforeach </ul>@endfragment
سپس، هنگام رندر کردن نمایی که از این الگو استفاده می کند، می توانید از
fragment
روش استفاده کنید تا مشخص کنید که فقط قطعه مشخص شده باید در پاسخ HTTP خروجی گنجانده شود:
return view('dashboard', ['users' => $users])->fragment('user-list');
این
fragmentIf
روش به شما اجازه می دهد تا به صورت مشروط یک قطعه از یک view را بر اساس یک شرایط داده شده برگردانید. در غیر این صورت، کل نمای برگردانده می شود:
return view('dashboard', ['users' => $users]) ->fragmentIf($request->hasHeader('HX-Request'), 'user-list');
متدهای
fragments
و
fragmentsIf
به شما این امکان را می دهند که چند قطعه نمایش را در پاسخ برگردانید. قطعات به هم متصل خواهند شد:
view('dashboard', ['users' => $users]) ->fragments(['user-list', 'comment-list']); view('dashboard', ['users' => $users]) ->fragmentsIf( $request->hasHeader('HX-Request'), ['user-list', 'comment-list'] );
تیغه گسترش دهنده
Blade به شما اجازه می دهد تا دستورالعمل های سفارشی خود را با استفاده از این
directive
روش تعریف کنید. هنگامی که کامپایلر Blade با دستور سفارشی روبرو می شود، callback ارائه شده را با عبارتی که دستور دارد فراخوانی می کند.
مثال زیر
@datetime($var)
دستورالعملی را ایجاد می کند که یک داده را فرمت می کند
$var
، که باید نمونه ای از آن باشد
DateTime
:
<?php namespace App\Providers; use Illuminate\Support\Facades\Blade;use Illuminate\Support\ServiceProvider; class AppServiceProvider extends ServiceProvider{ /** * Register any application services. */ public function register(): void { // ... } /** * Bootstrap any application services. */ public function boot(): void { Blade::directive('datetime', function (string $expression) { return "<?php echo ($expression)->format('m/d/Y H:i'); ?>"; }); }}
همانطور که می بینید، ما
format
متد را به هر عبارتی که به دستورالعمل منتقل می شود زنجیره می کنیم. بنابراین، در این مثال، PHP نهایی تولید شده توسط این دستورالعمل به صورت زیر خواهد بود:
<?php echo ($var)->format('m/d/Y H:i'); ?>
پس از بهروزرسانی منطق یک دستورالعمل Blade، باید تمام نماهای کش شده Blade را حذف کنید. نماهای کش شده Blade ممکن است با استفاده از
view:clear
دستور Artisan حذف شوند.
اکو هندلرهای سفارشی
اگر سعی کنید یک شی را با استفاده از Blade "اکو" کنید، روش شیء
__toString
فراخوانی می شود. این
__toString
متد یکی از «روشهای جادویی» داخلی PHP است. با این حال، گاهی اوقات ممکن است روی روش یک کلاس خاص کنترل نداشته باشید
__toString
، مانند زمانی که کلاسی که با آن در تعامل هستید متعلق به یک کتابخانه شخص ثالث است.
در این موارد، Blade به شما این امکان را می دهد که یک کنترل کننده پژواک سفارشی برای آن نوع شی خاص ثبت کنید. برای انجام این کار، باید از روش Blade استفاده کنید
stringable
. روش
stringable
بسته شدن را می پذیرد. این بسته باید نوع شیئی را که مسئول رندر کردن آن است نشان دهد. به طور معمول، متد باید در
متد کلاس برنامه شما
stringable
فراخوانی شود
:
boot
AppServiceProvider
use Illuminate\Support\Facades\Blade;use Money\Money; /** * Bootstrap any application services. */public function boot(): void{ Blade::stringable(function (Money $money) { return $money->formatTo('en_GB'); });}
هنگامی که کنترل کننده اکو سفارشی شما تعریف شد، می توانید به سادگی شی را در قالب Blade خود بازتاب دهید:
Cost: {{ $money }}
بیانیه های سفارشی If
برنامه نویسی یک دستور العمل سفارشی گاهی اوقات پیچیده تر از آنچه لازم است در هنگام تعریف دستورات شرطی ساده و سفارشی است. به همین دلیل، Blade
Blade::if
روشی را ارائه می دهد که به شما امکان می دهد به سرعت دستورالعمل های شرطی سفارشی را با استفاده از بسته شدن تعریف کنید. به عنوان مثال، اجازه دهید یک شرطی سفارشی تعریف کنیم که "دیسک" پیش فرض پیکربندی شده را برای برنامه بررسی می کند. ما ممکن است این کار را در
boot
روش خود انجام دهیم
AppServiceProvider
:
use Illuminate\Support\Facades\Blade; /** * Bootstrap any application services. */public function boot(): void{ Blade::if('disk', function (string $value) { return config('filesystems.default') === $value; });}
هنگامی که شرطی سفارشی تعریف شد، می توانید از آن در قالب های خود استفاده کنید:
@disk('local') <!-- The application is using the local disk... -->@elsedisk('s3') <!-- The application is using the s3 disk... -->@else <!-- The application is using some other disk... -->@enddisk @unlessdisk('local') <!-- The application is not using the local disk... -->@enddisk