مقدمه
Blade ساده است اما templating engine قدرتمندی را با لاراول پیاده کرده است.برخلاف سایر انجین های PHP Template، اما Blade شما را به استفاده از کد PHP ساده در view های خود محدود نمی کند.در واقع ، تمام Blade view ها به کد ساده PHP کامپایل می شوند و تا زمانی که اصلاح نشوند ، کش می شوند ، به این معنی که Blade اساساً overhead یی به برنامه شما اضافه نمی کند. فایلهای Blade view از فایلی با پسوند .blade.php استفاده می کنند و به طور معمول در دایرکتوری resources/views ذخیره می شوند.
وراثت Template
تعریف یک Layout
دو مورد از مزایای اصلی استفاده از Blade ، وراثت الگوها و بخش ها است.برای شروع ، اجازه دهید یک مثال ساده را مرور کنیم. ابتدا طرح صفحه "master" را بررسی خواهیم کرد. از آنجا که بیشتر برنامه های وب همان طرح کلی را در بین صفحات مختلف حفظ می کنند ، تعریف این طرح به عنوان یک Blade view مناسب است:
همانطور که مشاهده می کنید ، این فایل حاوی نشانه گذاری HTML معمولی است. با این حال ، به دستور های @section و @yield توجه کنید. دستور@section همانطور که از نام آن پیداست ، بخشی از محتوا را تعریف می کند ، در حالی که دستور @yield برای نمایش محتوای یک بخش مشخص استفاده می شود.
اکنون که ما یک طرح برای برنامه خود تعریف کرده ایم ، بیایید یک صفحه child را تعریف کنیم که از این layout ارث بری می کند.
گسترش یک Layout
هنگام تعریف child view ، از دستورالعمل Blade @extends استفاده کنید تا مشخص کنید که کدام child view باید inherit داشته باشد. view هایی که یک Blade layout را گسترش می دهند با استفاده از دستورهای@section می توانند محتوا را به بخش های layout اضافه کنند. به یاد داشته باشید ، همانطور که در مثال بالا مشاهده می شود ، مطالب این بخش ها با استفاده از @yield در layout نمایش داده می شوند:
در این مثال ، بخش sidebar با استفاده از دستور @parent برای اضافه کردن مطالب (به جای نوشتن متن) در sidebar طرح قرار دارد. دستور @parent هنگام ارائه view جایگزین محتوای layout می شود.
نکته: برخلاف مثال قبلی ، این بخش sidebar به جای@show با @endsection به پایان می رسد. دستورالعمل@endsection فقط یک بخش را تعریف می کند در حالی که@show بخش را تعریف و immediately yield می کند.
دستور @yield همچنین یک مقدار پیش فرض را به عنوان پارامتر دوم خود می پذیرد. در صورت عدم تعریف yielded ، این مقدار ارائه می شود:
@yield('content', View::make('view.name'))
Blade views ممکن است از مسیرهایی با از global view
helper برگردانده شود :
Route::get('blade', function () {
return view('child');
});
نمایش داده ها
شما می توانید با قرار دادن متغیر{} ، داده های منتقل شده به blade view های خود را نمایش دهید. به عنوان مثال :
Route::get('greeting', function () {
return view('welcome', ['name' => 'Samantha']);
});
شما می توانید محتویات متغیر name را به صورت زیر نمایش دهید:
Hello, {{ $name }}.
نکته: عبارات Blade {{ }}
اتومات از طریق تابع PHP's htmlspecialchars
برای جلوگیری از حملات XSS ارسال می شوند.
شما محدود به نمایش محتوای متغیرهای ارسال شده به view نیستید. همچنین می توانید نتایج توابع PHP را چاپ کنید. در واقع ، می توانید هر کد PHP مورد نظر خود را در داخل یک عبارت Blade echo قرار دهید:
The current UNIX timestamp is {{ time() }}.
نمایش داده های Unescaped
به طور پیش فرض ، عبارات Blade {{ }} به طور خودکار از طریق تابع PHP's htmlspecialchars
برای جلوگیری از حملات XSS ارسال می شوند. اگر نمی خواهید داده های شما escape کنند ، می توانید از دستور زیر استفاده کنید:
Hello, {!! $name !!}.
هنگام echo محتوایی که توسط کاربران برنامه شما ارائه می شود ، بسیار دقت کنید. برای جلوگیری از حملات XSS هنگام نمایش داده های ارائه شده توسط کاربر ، همیشه از syntax {} استفاده کنید.
رندر کردن JSON
گاهی اوقات ممکن است آرایه ای را به view به عنوان JSON به صورت یک متغیر JavaScript ارسال کنید. مثلا:
<script>
var app = <?php echo json_encode($array); ?>;
</script>
باید از دستور @json برای ارائه متغیرهای موجود به عنوان JSON استفاده کنید. Blade templating مبتنی بر regular expressions است و تلاش برای ارسال complex expression به دستور ممکن است باعث شکستهای غیر منتظره شود.
دستور @json همچنین برای کامپوننت هایseeding Vue یا ویژگی های *-data مفید است:
<example-component :some-prop='@json($array)'></example-component>
HTML Entity Encoding
به طور پیش فرض ، Blade (و Laravel e
helper) کد HTML را دابل encode می کند. اگر می خواهید دابل encode را غیرفعال کنید ، متد Blade::withoutDoubleEncoding از متد boot از AppServiceProvider را فراخوانی کنید:
فریم ورک های Blade و JavaScript
از آنجا که در بسیاری از فریم ورک های جاوا اسکریپت از {} نیز استفاده می شود تا بیان شود که عبارتی باید در مرورگر نمایش داده شود ، می توانید از نماد @ استفاده کنید. مثلا:
<h1>Laravel</h1>
Hello, @{{ name }}.
در این مثال ، نماد @ توسط Blade حذف خواهد شد. با این حال ، عبارت {{ name }} توسط Blade engine دست نخورده باقی خواهد ماند و اجازه می دهد توسط فریم ورک JavaScript شما ارائه شود.
دستور @verbatim
اگر متغیرهای جاوا اسکریپت را در بخش بزرگی از template خود نمایش می دهید ، می توانید HTML را در دستور @verbatim قرار دهید تا مجبور نشوید برای پیشوند هر statement blade یک نماد @ اضافه کنید:
@verbatim
<div class="container">
Hello, {{ name }}.
</div>
@endverbatim
ساختار کنترل
علاوه بر ارث بری template و نمایش داده ها ، Blade میانبرهای مناسبی را برای ساختارهای کنترل معمول PHP مانند دستورات شرطی و حلقه ها نیز فراهم می کند. این میانبرها روشی بسیار تمیز و مختصر با ساختارهای کنترل PHP را ارائه می دهند.
دستورات If
می توانید دستورات if را با استفاده از دستورهای@if
, @elseif
, @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
دستور العمل های Authentication
از دستورهای @guest و @auth می توان برای تشخیص سریع احراز هویت کاربر جاری یا مهمان بودن استفاده کرد:
@auth
// The user is authenticated...
@endauth
@guest
// The user is not authenticated...
@endguest
در صورت نیاز ، می توانید authentication guard تعیین کنید که باید هنگام استفاده از دستورهای@guest و @auth بررسی شود:
@auth('admin')
// The user is authenticated...
@endauth
@guest('admin')
// The user is not authenticated...
@endguest
دستور العمل های Section
با استفاده از دستور @hasSection شما می توانید بررسی کنید که یک section دارای content است یا خیر:
@hasSection('navigation')
<div class="pull-right">
@yield('navigation')
</div>
<div class="clearfix"></div>
@endif
دستورات Switch
دستورات Switch را می توان با استفاده از دستور های @switch
, @case
, @break
, @default
و@endswitch ایجاد کرد:
@switch($i)
@case(1)
First case...
@break
@case(2)
Second case...
@break
@default
Default case...
@endswitch
حلقه ها
علاوه بر عبارات شرطی ، Blade دستورالعمل های ساده ای برای کار با ساختارهای حلقه 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
هنگام حلقه ، می توانید از متغیر loop استفاده کنید تا اطلاعات ارزشمندی در مورد loop بدست آورید ، مانند اینکه آیا در اولین یا آخرین حلقه تکرار هستید.
هنگام استفاده از حلقه ها ، ممکن است حلقه را پایان دهید یا تکرار جاری را skipکنید:
@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
متغیر loop
هنگام حلقه ، یک متغیر $loop در داخل حلقه در دسترس خواهد بود. این متغیر دسترسی به چند بیت مفید از اطلاعات مانند index حلقه جاری و اینکه آیا این اولین یا آخرین تکرار از طریق حلقه است را فراهم می کند:
@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
اگر در یک حلقه تو در تو قرار دارید ، می توانید از طریق parent
property به متغیر$loop حلقه والد دسترسی پیدا کنید:
@foreach ($users as $user)
@foreach ($user->posts as $post)
@if ($loop->parent->first)
This is first iteration of the parent loop.
@endif
@endforeach
@endforeach
متغیر $loop همچنین شامل انواع دیگری از property های مفید است:
تعریف Comment
Blade همچنین به شما امکان تعریف comment در view ها را می دهد. با این حال ، بر خلاف HTML comment، کامنت های Blade در HTML بازگشتی توسط برنامه شما وجود ندارد:
{{-- This comment will not be present in the rendered HTML --}}
PHP
در برخی شرایط ، قرار دادن کد PHP در view های شما مفید است. می توانید از دستور Blade @php
برای اجرای یک بلاک PHP در tempalte خود استفاده کنید:
@php
//
@endphp
در حالی که Blade این feature را ارائه می دهد ، استفاده مكرر از آن ممكن است نشانه این باشد كه شما logic زیادی را در template خود embed كرده اید.
ادامه دارد...