الفرق بين المراجعتين لصفحة: «Laravel/blade»
لا ملخص تعديل |
رؤيا-بنعطية (نقاش | مساهمات) ط استبدال النص - '\[\[تصنيف:(.*)\]\]' ب'{{SUBPAGENAME}}' |
||
(26 مراجعة متوسطة بواسطة مستخدمين اثنين آخرين غير معروضة) | |||
سطر 1: | سطر 1: | ||
<noinclude>{{DISPLAYTITLE:قوالب Blade }}</noinclude> | <noinclude>{{DISPLAYTITLE: قوالب Blade في Laravel }}</noinclude> | ||
== مقدمة == | |||
يقدم [[Laravel]] محرّك قولبةٍ بسيطاً لكن قويٌّ و فعّال هو Blade. على خلاف محرّكات [[PHP]] أخرى، لا يمنع Blade المستخدم من استعمال شيفرات [[PHP]] في الواجهة، بل إنّه يحوِِّل صفحات Blade إلى شيفرة PHP ويخزِّنها تخزينًا مؤقتًا إلى حين تغييرها. ممّا يعني أنّ Blade لا يتطلب أيّ جهد أو وقت إضافي من التطبيق. تنتهي صفحات Blade بالامتداد <code>blade.php</code>. وتوجد عادة في مجلد <code>resources/views</code>. | |||
== توريث القوالب == | |||
توريث القوالب | |||
=== تعريف التخطيط === | |||
إنّ من الفوائد الأساسية لاستخدام Blade هي توريث القوالب (template inheritance) واستخدام الأقسام (sections). في البداية، سنأخذ مثالًا بسيطًا لصفحة master رئيسية. ولمّا كانت معظم تطبيقات الويب تحافظ على تخطيط عام في مختلف الصفحات، فإنَّ من الملائم تعريف هذا التخطيط العامّ في واجهة Blade:<syntaxhighlight lang="html"> | إنّ من الفوائد الأساسية لاستخدام Blade هي توريث القوالب (template inheritance) واستخدام الأقسام (sections). في البداية، سنأخذ مثالًا بسيطًا لصفحة master رئيسية. ولمّا كانت معظم تطبيقات الويب تحافظ على تخطيط عام في مختلف الصفحات، فإنَّ من الملائم تعريف هذا التخطيط العامّ في واجهة Blade:<syntaxhighlight lang="html"> | ||
<!-- | <!--resources/views/layouts/app.blade.php موجودة في--> | ||
<html> | <html> | ||
سطر 25: | سطر 21: | ||
</body> | </body> | ||
</html> | </html> | ||
</syntaxhighlight>يمكنك الملاحظة أنّ الكود يحتوي على عناصر HTML التقليدية، لكنّه يحتوي أيضًا على التعليمتين @section و @yield. تُعرِّف التعليمة @section قسمًا أو جزءًا لإضافة المحتوى، بينما تعرض التعليمة @yield محتوى قسم معيّن. | </syntaxhighlight>يمكنك الملاحظة أنّ الكود يحتوي على عناصر [[HTML]] التقليدية، لكنّه يحتوي أيضًا على التعليمتين <code>@section</code> و <code>@yield</code>. تُعرِّف التعليمة <code>@section</code> قسمًا أو جزءًا لإضافة المحتوى، بينما تعرض التعليمة <code>@yield</code> محتوى قسم معيّن. | ||
أمّا الآن بعد أن عرّفنا تخطيطًا عامًّا للتطبيق، فسنصنع الصفحات التي سترث هذا التخطيط. | أمّا الآن بعد أن عرّفنا تخطيطًا عامًّا للتطبيق، فسنصنع الصفحات التي سترث هذا التخطيط. | ||
تمديد التخطيط | === تمديد التخطيط === | ||
عند إنشاء واجهة ابن جديدة، تُستخدَم التعليمة <code>@extends</code> لتحديد أي التخطيطات يجب على هذه الواجهة أن ترث. بإمكان الواجهات التي ترث تخطيطًا أن تضيف محتوى لأحد أقسامه باستخدام تعليمات <code>@section</code>. كما رأينا سابقًا، يمكن إظهار هذا المحتوى باستخدام التعليمة <code>@yield</code>. <syntaxhighlight lang="php"> | |||
عند إنشاء واجهة ابن جديدة، تُستخدَم التعليمة @extends لتحديد أي التخطيطات يجب على هذه الواجهة أن ترث. بإمكان الواجهات التي ترث تخطيطًا أن تضيف محتوى لأحد أقسامه باستخدام تعليمات @section. كما رأينا سابقًا، يمكن إظهار هذا المحتوى باستخدام التعليمة @yield. <syntaxhighlight lang="php"> | <!-- resources/views/child.blade.php موجودة في --> | ||
<!-- | |||
@extends('layouts.app') | @extends('layouts.app') | ||
سطر 43: | سطر 38: | ||
<p>يُضاف هذا للقائمة الرئيسية الجانبية.</p> | <p>يُضاف هذا للقائمة الرئيسية الجانبية.</p> | ||
@endsection | @endsection | ||
سطر 49: | سطر 43: | ||
This is my body content. | This is my body content. | ||
@endsection | @endsection | ||
</syntaxhighlight>في المثال السابق، يستخدم القسم sidebar التعليمة @parent ليمدد (بدل إعادة تعريف) محتوى القسم في التخطيط. ستُعوَّض التعليمة @parent بمحتواها من التخطيط عند استدعاء الواجهة. | </syntaxhighlight>في المثال السابق، يستخدم القسم sidebar التعليمة <code>@parent</code> ليمدد (بدل إعادة تعريف) محتوى القسم في التخطيط. ستُعوَّض التعليمة <code>@parent</code> بمحتواها من التخطيط عند استدعاء الواجهة. | ||
ملاحظة: على عكس المثال الأول، انتهى القسم sidebar هنا بالتعليمة @endsection بدل @show. تُستعمَل التعليمة @endsection للإعلان عن انتهاء قسمٍ ما، بينما تُستعمل @show لإعلان انتهاء قسم وإظهاره مباشرة. | ملاحظة: على عكس المثال الأول، انتهى القسم sidebar هنا بالتعليمة <code>@endsection</code> بدل <code>@show</code>. تُستعمَل التعليمة <code>@endsection</code> للإعلان عن انتهاء قسمٍ ما، بينما تُستعمل <code>@show</code> لإعلان انتهاء قسم وإظهاره مباشرة. | ||
بالإمكان إعادة واجهات Blade مباشرة من صفحة المسارات وذلك باستخدام التابع المساعد العام .show<syntaxhighlight lang="php"> | بالإمكان إعادة واجهات Blade مباشرة من صفحة المسارات وذلك باستخدام التابع المساعد العام .<code>show</code><syntaxhighlight lang="php"> | ||
Route::get('blade', function () { | Route::get('blade', function () { | ||
سطر 63: | سطر 56: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
المكونات والأماكن (Components & Slots) | == المكونات والأماكن (Components & Slots) == | ||
تُقدِم المكونات و الأماكن فوائد مشابهة لتلك التي تُقدمها الأقسام والتخطيطات و قد يجدها البعض أسهل في الفهم. في البداية. سنبدأ بصناعة مكون قابل لإعادة الاستخدام "alert" لاستخدامه في كامل التطبيق:<syntaxhighlight lang="php"> | تُقدِم المكونات و الأماكن فوائد مشابهة لتلك التي تُقدمها الأقسام والتخطيطات و قد يجدها البعض أسهل في الفهم. في البداية. سنبدأ بصناعة مكون قابل لإعادة الاستخدام "alert" لاستخدامه في كامل التطبيق:<syntaxhighlight lang="php"> | ||
<!-- /resources/views/alert.blade.php --> | <!-- /resources/views/alert.blade.php --> | ||
سطر 71: | سطر 63: | ||
{{ $slot }} | {{ $slot }} | ||
</div> | </div> | ||
</syntaxhighlight>< | </syntaxhighlight>سوف يتضمّن المتغيّر <code>slot$</code> المحتوى الذي نريد إضافته إلى المكوّن. أمّا لصناعة المكوّن، يمكن استخدام الموجّه <code>component@</code>:<syntaxhighlight lang="php"> | ||
@component('alert') | @component('alert') | ||
Whoops! Something went wrong! | Whoops! Something went wrong! | ||
سطر 86: | سطر 78: | ||
@endcomponent | @endcomponent | ||
</syntaxhighlight> | </syntaxhighlight> | ||
قد نحتاج في بعض الأحيان إلى تمرير بيانات إضافية لأحدى المكوّنات، ولهذا بالإمكان تمرير مصفوفة معلومات كمعامل ثاني للتعليمة @component. كل المعلومات المُمَرّرة ستكون متاحة لقالب المكوّن على شكل متغيّرات:<syntaxhighlight lang="php"> | === تمرير بيانات إضافية للمكونات === | ||
قد نحتاج في بعض الأحيان إلى تمرير بيانات إضافية لأحدى المكوّنات، ولهذا بالإمكان تمرير مصفوفة معلومات كمعامل ثاني للتعليمة <code>@component</code>. كل المعلومات المُمَرّرة ستكون متاحة لقالب المكوّن على شكل متغيّرات:<syntaxhighlight lang="php"> | |||
@component('alert', ['foo' => 'bar']) | @component('alert', ['foo' => 'bar']) | ||
... | ... | ||
سطر 95: | سطر 88: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
أسماء بديلة للمكوّن | === أسماء بديلة للمكوّن === | ||
إن كانت المكوّنات محفوظة في ملف داخلي، بالإمكان إعطاؤها أسماءً بديلةً لتسهيل استخدامها. على سبيل المثال، إن كان المكوّن موجودًا في <code>resources/views/components/alert.blade.php</code> فسيكون بالإمكان استخدام التابع <code>component</code> لإعطاء إسم بديل للمكون <code>components.alert</code> ليصبح <code>alert</code>. في العادة يمكن القيام بهذا في التابع <code>boot</code> في صفحة AppServiceProvider<syntaxhighlight lang="php"> | |||
إن كانت المكوّنات محفوظة في ملف داخلي، بالإمكان إعطاؤها أسماءً بديلةً لتسهيل استخدامها. على سبيل المثال، إن كان المكوّن موجودًا في resources/views/components/alert.blade.php فسيكون بالإمكان استخدام التابع component لإعطاء إسم بديل للمكون components.alert ليصبح alert. في العادة يمكن القيام بهذا في التابع boot في صفحة AppServiceProvider<syntaxhighlight lang="php"> | |||
use Illuminate\Support\Facades\Blade; | use Illuminate\Support\Facades\Blade; | ||
Blade::component('components.alert','alert'); | Blade::component('components.alert','alert'); | ||
</syntaxhighlight> | </syntaxhighlight> | ||
سطر 119: | سطر 110: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
إظهار البيانات | == إظهار البيانات == | ||
يمكن إظهار البيانات المُمرّرة إلى الواجهة عن طريق إحاطة المتغيّرة بأقواس معقوفة. على سبيل المثال، لدينا المسار التالي:<syntaxhighlight lang="php"> | يمكن إظهار البيانات المُمرّرة إلى الواجهة عن طريق إحاطة المتغيّرة بأقواس معقوفة. على سبيل المثال، لدينا المسار التالي:<syntaxhighlight lang="php"> | ||
Route::get('greeting', function () { | Route::get('greeting', function () { | ||
سطر 129: | سطر 119: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
يُعرَض محتوى المتغيّر name كما يلي:<syntaxhighlight lang="php"> | يُعرَض محتوى المتغيّر <code>name</code> كما يلي:<syntaxhighlight lang="php"> | ||
Hello, {{ $name }} | Hello, {{ $name }} | ||
</syntaxhighlight> | </syntaxhighlight> | ||
سطر 137: | سطر 127: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
<nowiki>ملاحظة: ستُمرَّر محتويات الأقواس المعقوفة {{ }} تلقائيًا إلى دالة htmlspecialchars PHP للحد من هجمات XSS. | <nowiki>ملاحظة: ستُمرَّر محتويات الأقواس المعقوفة {{ }} تلقائيًا إلى دالة </nowiki><code>[[PHP/htmlspecialchars|htmlspecialchars]]</code> PHP للحد من هجمات XSS. | ||
عرض البيانات غير المهرّبة | === عرض البيانات غير المهرّبة === | ||
في العادة، ستُمرَّر بيانات الأقواس المعقّفة إلى الدالة <code>[[PHP/htmlspecialchars|htmlspecialchars]]</code> للحد من هجمات XSS. إن أردت أن تكون البيانات مهربةً (escaped) ، فيمكن استعمال التركيب التالي:<syntaxhighlight lang="php"> | |||
في العادة، ستُمرَّر بيانات الأقواس المعقّفة إلى الدالة htmlspecialchars للحد من هجمات XSS. إن أردت أن تكون البيانات مهربةً (escaped) ، فيمكن استعمال التركيب التالي:<syntaxhighlight lang="php"> | |||
Hello, {!! $name !!} | Hello, {!! $name !!} | ||
</syntaxhighlight> | </syntaxhighlight> | ||
سطر 147: | سطر 136: | ||
كن حذرًا عند عرض بيانات مقدّمة من المستخدم! استخدم دائمًا البيانات المُهرَّبة بين أقواس معقوفة للحد من الهجمات. | كن حذرًا عند عرض بيانات مقدّمة من المستخدم! استخدم دائمًا البيانات المُهرَّبة بين أقواس معقوفة للحد من الهجمات. | ||
عرض صيغة JSON | === عرض صيغة JSON === | ||
في بعض الأحيان، قد نمرّر مصفوفة بيانات بُغية عرضها على هيئة صيغة JSON لتعريف متغير [[JavaScript]]. على سبيل المثال:<syntaxhighlight lang="html+php"> | |||
في بعض الأحيان، قد نمرّر مصفوفة بيانات بُغية عرضها على هيئة صيغة JSON لتعريف متغير JavaScript. على سبيل المثال:<syntaxhighlight lang="html+php"> | |||
<script> | <script> | ||
سطر 157: | سطر 145: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
لكن عوض استخدام الدالة | لكن عوض استخدام الدالة <code>json_encode</code>، يمكن استخدام التعليمة <code>@json</code>:<syntaxhighlight lang="html+php"> | ||
<script> | <script> | ||
سطر 165: | سطر 153: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
ترميز كائن HTML | === ترميز كائن HTML === | ||
في الحالة العاديّة، blade [والمساعد e بصفة أخص] يرمِّز كائنات [[HTML]] بصفة مضاعفة. إن أردت إيقاف الترميز المضاعف يمكنك استدعاء التابع <code>Blade::withoutDoubleEncoding</code> من التابع <code>boot</code> في الصفحة AppServiceProvider:<syntaxhighlight lang="php"> | |||
في الحالة العاديّة، blade [والمساعد e بصفة أخص] يرمِّز كائنات HTML بصفة مضاعفة. إن أردت إيقاف الترميز المضاعف يمكنك استدعاء التابع Blade::withoutDoubleEncoding من التابع boot في الصفحة AppServiceProvider<syntaxhighlight lang="php"> | |||
<?php | <?php | ||
namespace App\Providers; | namespace App\Providers; | ||
use Illuminate\Support\Facades\Blade; use Illuminate\Support\ServiceProvider; | use Illuminate\Support\Facades\Blade; use Illuminate\Support\ServiceProvider; | ||
سطر 177: | سطر 163: | ||
/** | /** | ||
* | * .التمهيد لخدمات التطبيق | ||
* | * | ||
* @return void | * @return void | ||
سطر 189: | سطر 175: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
استعمال Blade مع إطارات JavaScript | === استعمال Blade مع إطارات [[JavaScript]] === | ||
لمّا كانت العديد من إطارات [[JavaScript]] تستعمل الأقواس المعقوفة للتعبير على أن جملة معيّنة يجب أن تظهر في المتصفح، يمكن استخدام الرمز @ لإعلام محرّك الإظهار في Blade بأن الجملة يجب أن تبقى كما هي دون تغيير:<syntaxhighlight lang="html+php"> | |||
لمّا كانت العديد من إطارات JavaScript تستعمل الأقواس المعقوفة للتعبير على أن جملة معيّنة يجب أن تظهر في المتصفح، يمكن استخدام الرمز @ لإعلام محرّك الإظهار في Blade بأن الجملة يجب أن تبقى كما هي دون تغيير<syntaxhighlight lang="html+php"> | |||
<h1>Laravel</h1> | <h1>Laravel</h1> | ||
سطر 198: | سطر 183: | ||
</syntaxhighlight>في هذا المثال، سيحذف blade الرمز @ لكنه سيبقي على الجملة <nowiki>{{name}}</nowiki> كما هي ممّا سيسمح لها بأن تُعالَج في إطار JavaScript الذي تستخدمه. | </syntaxhighlight>في هذا المثال، سيحذف blade الرمز @ لكنه سيبقي على الجملة <nowiki>{{name}}</nowiki> كما هي ممّا سيسمح لها بأن تُعالَج في إطار JavaScript الذي تستخدمه. | ||
التعليمة @verbatim | ==== التعليمة <code>@verbatim</code> ==== | ||
إن كنت تعرض متغيرات JavaScript في قسم كبير من الشيفرة يمكنك إحاطة شيفرة HTML بالتعليمة <code>@verbatim</code> حتّى لا تضطر لإسباق كل تعليمة عرض بالرمز @:<syntaxhighlight lang="html+php"> | |||
إن كنت تعرض متغيرات JavaScript في قسم كبير من الشيفرة يمكنك إحاطة شيفرة HTML بالتعليمة @verbatim حتّى لا تضطر لإسباق كل تعليمة عرض بالرمز @:<syntaxhighlight lang="html+php"> | |||
@verbatim | @verbatim | ||
<div class="container"> | <div class="container"> | ||
سطر 208: | سطر 192: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
بنى التحكم | == بنى التحكم == | ||
بالإضافة لتوريث القوالب وعرض البيانات يُقدّم Blade اختصارات مفيدة لبنى تحكّم [[PHP]] الشائعة مثل عبارات التحكّم وحلقات التكرار. هذه الاختصارات توفّر طريقة سهلة ومقتضبة لاستخدام بنى التحكّم في حين تبقى مألوفةً ومشابهةً لنظيراتها من تعابير PHP. | |||
=== العبارة if === | |||
يمكنك صياغة البنية if باستخدام التعليمات <code>@if</code>، و <code>@elseif</code>، و <code>@else</code>، و <code>@endif</code>. هذه التعليمات تعمل تمامًا مثل نظيراتها في [[PHP]].<syntaxhighlight lang="php"> | |||
العبارة if | |||
يمكنك صياغة البنية if باستخدام التعليمات @ | |||
@if (count($records) === 1) | @if (count($records) === 1) | ||
سطر 229: | سطر 212: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
يُوفِّر Blade الموجّه @unless كوسيلة لتسهيل الاستخدام:<syntaxhighlight lang="php"> | يُوفِّر Blade الموجّه <code>@unless</code> كوسيلة لتسهيل الاستخدام:<syntaxhighlight lang="php"> | ||
@unless (Auth::check()) | @unless (Auth::check()) | ||
سطر 237: | سطر 220: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
إضافة للموجّهات الشَّرطية التي ذكرناها، يُوفّر Blade التعليمتين @isset | إضافة للموجّهات الشَّرطية التي ذكرناها، يُوفّر Blade التعليمتين <code>@isset</code> و<code>@empty</code> كاختصارين لنظيريهما من دوال PHP: | ||
<syntaxhighlight lang="php"> | <syntaxhighlight lang="php"> | ||
@isset($records) | @isset($records) | ||
// معرّف وذو قيمة $records | |||
// $records | |||
@endisset | @endisset | ||
@empty($records) | @empty($records) | ||
// "empty" أصبح $records | |||
@endempt | @endempt | ||
</syntaxhighlight> | </syntaxhighlight> | ||
تعليمات الاستيثاق | === تعليمات الاستيثاق === | ||
تُستخدم التعليمات <code>@auth</code> و <code>@guest</code> للتحقّق بسرعة من إذا ما كان المستخدم مسجلًا الدخول أو كان زائرًا:<syntaxhighlight lang="php"> | |||
تُستخدم التعليمات @auth و @guest للتحقّق بسرعة من إذا ما كان المستخدم مسجلًا الدخول أو كان زائرًا:<syntaxhighlight lang="php"> | |||
@auth | @auth | ||
// | // ...هذا المستخدم مسجّل الدخول | ||
@endauth | @endauth | ||
@guest | @guest | ||
// | // ...هذا المستخدم غير مسجّل الدخول | ||
@endguest | @endguest | ||
</syntaxhighlight> | </syntaxhighlight> | ||
إذا لزم الأمر، يمكن استخدام حارس الاستيثاق (authentication guard) والذي يجب التحقق منه عند استعمال إحدى التعليمتين @auth أو @guest: | إذا لزم الأمر، يمكن استخدام حارس الاستيثاق (authentication guard) والذي يجب التحقق منه عند استعمال إحدى التعليمتين <code>@auth</code> أو <code>@guest</code>: | ||
<syntaxhighlight lang="php"> | <syntaxhighlight lang="php"> | ||
@auth('admin') | @auth('admin') | ||
// | // ...هذا المستخدم مسجّل الدخول | ||
@endauth | @endauth | ||
سطر 278: | سطر 254: | ||
@guest('admin') | @guest('admin') | ||
// | // ...هذا المستخدم غير مسجّل الدخول | ||
@endguest | @endguest | ||
</syntaxhighlight> | </syntaxhighlight> | ||
تعليمات الأقسام | === تعليمات الأقسام === | ||
يمكن التحقّق إذا كان القسم به محتوى أم لا باستخدام التعليمة <code>@hassection</code>: | |||
يمكن التحقّق إذا كان القسم به محتوى أم لا باستخدام التعليمة @hassection: | |||
<syntaxhighlight lang="php"> | <syntaxhighlight lang="php"> | ||
@hasSection('navigation') | @hasSection('navigation') | ||
سطر 296: | سطر 271: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
العبارة switch | === العبارة switch === | ||
تُصاغ البنية <code>switch</code> باستخدام الموجّهات <code>@switch</code>، و <code>@case</code>، و <code>@break</code>، و <code>@default</code>، و <code>@endswitch</code>: | |||
تُصاغ البنية switch باستخدام الموجّهات @ | |||
<syntaxhighlight lang="php"> | <syntaxhighlight lang="php"> | ||
سطر 313: | سطر 287: | ||
@endswitch | @endswitch | ||
</syntaxhighlight> | </syntaxhighlight> | ||
=== الحلْقات === | |||
بالإضافة للعبارات الشَّرطية، يوفِّر Blade تعليمات بسيطة للعمل مع بنى PHP الحلقيّة. تعمل هذه التعليمات بطريقة مشابهة لنظيرتها في PHP:<syntaxhighlight lang="php"> | بالإضافة للعبارات الشَّرطية، يوفِّر Blade تعليمات بسيطة للعمل مع بنى PHP الحلقيّة. تعمل هذه التعليمات بطريقة مشابهة لنظيرتها في PHP:<syntaxhighlight lang="php"> | ||
@for ($i = 0; $i < 10; $i++) | @for ($i = 0; $i < 10; $i++) | ||
سطر 361: | سطر 336: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
المتغيّر loop | === المتغيّر loop === | ||
عند استخدام العبارات الحلقية، يُنشَأ المتغيّر <code>$loop</code> ويكون جاهزًا للاستخدام. يوفّر هذا المتغيّر عدّة معلومات مفيدة مثل إن كان التكرار الحالي الأول أو الأخير في الحلقة: | |||
عند استخدام العبارات الحلقية، يُنشَأ المتغيّر $loop ويكون جاهزًا للاستخدام. يوفّر هذا المتغيّر عدّة معلومات مفيدة مثل إن كان التكرار الحالي الأول أو الأخير في الحلقة: | |||
<syntaxhighlight lang="php"> | <syntaxhighlight lang="php"> | ||
@foreach ($users as $user) | @foreach ($users as $user) | ||
سطر 379: | سطر 353: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
عندما تكون في حلقات متداخلة كليًا، يمكن الولوج للمتغيّر $loop الخاصّ بالحلقة الأم أو الحلقة الخارجية باستخدام الخاصّية parent: | عندما تكون في حلقات متداخلة كليًا، يمكن الولوج للمتغيّر <code>$loop</code> الخاصّ بالحلقة الأم أو الحلقة الخارجية باستخدام الخاصّية <code>parent</code>:<syntaxhighlight lang="php"> | ||
@foreach ($users as $user) | @foreach ($users as $user) | ||
@foreach ($user->posts as $post) | |||
@if ($loop->parent->first) | |||
This is first iteration of the parent loop. | |||
@endif | |||
@endforeach | |||
@endforeach | @endforeach | ||
المتغيّر $loop يحتوي أيضًا على عدّة خاصيات أخرى مفيدة: | </syntaxhighlight> | ||
المتغيّر <code>$loop</code> يحتوي أيضًا على عدّة خاصيات أخرى مفيدة: | |||
الخاصّية | {| class="wikitable" | ||
التعريف | !الخاصّية | ||
!التعريف | |||
فهرس حلقة التكرار الحالية (يبدأ من 0). | |- | ||
|<code>loop->index$</code> | |||
حلقة التكرار الحالية (تبدأ من 1). | |فهرس حلقة التكرار الحالية (يبدأ من 0). | ||
|- | |||
عدد حلقات التكرار المتبقية. | |<code>loop->iteration$</code> | ||
|حلقة التكرار الحالية (تبدأ من 1). | |||
العدد الكلّي للعناصر في مصفوفة المعلومات المكرّرة. | |- | ||
|<code>loop->remaining$</code> | |||
إن كانت حلقة التكرار الحاليّة هي الأولى أم لا. | |عدد حلقات التكرار المتبقية. | ||
|- | |||
إن كانت حلقة التكرار الحالية هي الأخيرة أم لا. | |<code>loop->count$</code> | ||
|العدد الكلّي للعناصر في مصفوفة المعلومات المكرّرة. | |||
عمق التداخل في الحلقة الحالية. | |- | ||
|<code>loop->first$</code> | |||
في حالة الحلقات المتداخلة، المتغيّر $loop للحلقة الأم. | |إن كانت حلقة التكرار الحاليّة هي الأولى أم لا. | ||
|- | |||
التعليقات | |<code>loop->last$</code> | ||
يسمح Blade بإضافة تعليقات في الواجهات. على عكس تعليقات | |إن كانت حلقة التكرار الحالية هي الأخيرة أم لا. | ||
{{-- | |- | ||
PHP | |<code>loop->depth$</code> | ||
من المفيد في بعض الأحيان تضمين كود PHP في الواجهة. يمكن استخدام الموجّه php@ لتنفيذ مقطع من كود PHP في القالب: | |عمق التداخل في الحلقة الحالية. | ||
|- | |||
|<code>loop->parent$</code> | |||
|في حالة الحلقات المتداخلة، المتغيّر <code>$loop</code> للحلقة الأم. | |||
|} | |||
=== التعليقات === | |||
يسمح Blade بإضافة تعليقات في الواجهات. على عكس تعليقات [[HTML]]، فإن تعليقات Blade ليست مُضمّنة في شيفرة [[HTML]] الناتج من التطبيق: | |||
<syntaxhighlight lang="php"> | |||
{{-- هذا التعليق لن يظهر في الصفحة النهائية HTML --}} | |||
</syntaxhighlight> | |||
=== PHP === | |||
من المفيد في بعض الأحيان تضمين كود [[PHP]] في الواجهة. يمكن استخدام الموجّه <code>php@</code> لتنفيذ مقطع من كود [[PHP]] في القالب: | |||
<syntaxhighlight lang="php"> | |||
@php | @php | ||
// | |||
@endphp | @endphp | ||
</syntaxhighlight> | |||
ملاحظة: رغم أنّ Blade يوفّر هذه الخاصّية إلّا أنّ الإكثار من استخدامها يعني أن القالب يحتوي على الكثير من التحليل المنطقي. | ملاحظة: رغم أنّ Blade يوفّر هذه الخاصّية إلّا أنّ الإكثار من استخدامها يعني أن القالب يحتوي على الكثير من التحليل المنطقي. | ||
تسمح التعليمة @include بتضمين واجهة في واجهة أخرى. كل المتغيّرات المتاحة للواجهة الأم متاحة أيضًا للواجهة المضمّنة: | == تضمين الواجهات الفرعية == | ||
تسمح التعليمة <code>@include</code> بتضمين واجهة في واجهة أخرى. كل المتغيّرات المتاحة للواجهة الأم متاحة أيضًا للواجهة المضمّنة:<syntaxhighlight lang="html+php"> | |||
<div> | <div> | ||
@include('shared.errors') | @include('shared.errors') | ||
<form> | <form> | ||
<!-- Form | <!-- Form محتويات قسم --> | ||
</form> | </form> | ||
</div> | </div> | ||
بالإضافة إلى أنها سترث كل بيانات الواجهة الأم، يمكن أيضا تمرير مصفوفة بيانات إضافية إلى الواجهة المضمّنة: | </syntaxhighlight> | ||
بالإضافة إلى أنها سترث كل بيانات الواجهة الأم، يمكن أيضا تمرير مصفوفة بيانات إضافية إلى الواجهة المضمّنة:<syntaxhighlight lang="php"> | |||
@include('view.name', ['some' => 'data']) | @include('view.name', ['some' => 'data']) | ||
بالطبع إذا ضمّنت واجهة غير موجودة سيصدر Laravel خطأً. إذا أردت تضمين واجهة لست متأكدًا من وجودها، يمكنك استخدام التعليمة @includeif: | </syntaxhighlight> | ||
بالطبع إذا ضمّنت واجهة غير موجودة سيصدر [[Laravel]] خطأً. إذا أردت تضمين واجهة لست متأكدًا من وجودها، يمكنك استخدام التعليمة <code>@includeif</code>: | |||
<syntaxhighlight lang="php"> | |||
@includeWhen($boolean, 'view.name', ['some' => 'data']) | @includeWhen($boolean, 'view.name', ['some' => 'data']) | ||
لتضمين الواجهة الأولى الموجودة من مصفوفة واجهات، يمكن استخدام التعليمة @includeFirst: | </syntaxhighlight> | ||
لتضمين الواجهة الأولى الموجودة من مصفوفة واجهات، يمكن استخدام التعليمة <code>@includeFirst</code>: | |||
<syntaxhighlight lang="php"> | |||
@includeFirst(['custom.admin', 'admin'], ['some' => 'data']) | @includeFirst(['custom.admin', 'admin'], ['some' => 'data']) | ||
تحذير: من المفضّل تجنّب استخدام الثّوابت _DIR_ و _FILE_ في الواجهات لأنها تشير إلى أماكن وجود الواجهات المترجمة والمخزّنة مؤقتًا. | </syntaxhighlight> | ||
تحذير: من المفضّل تجنّب استخدام الثّوابت <code>_DIR_</code> و <code>_FILE_</code> في الواجهات لأنها تشير إلى أماكن وجود الواجهات المترجمة والمخزّنة مؤقتًا. | |||
إظهار الواجهات في المجموعات | === إظهار الواجهات في المجموعات === | ||
بالإمكان دمج التضمين و الحلقات في سطر واحد باستخدام التعليمة | بالإمكان دمج التضمين و الحلقات في سطر واحد باستخدام التعليمة <code>each@</code>:<syntaxhighlight lang="html"> | ||
@each('view.name', $jobs, 'job') | @each('view.name', $jobs, 'job') | ||
المعامل الأول هو الواجهة الجزئية التي ستُظهَر لكل عنصر من المصفوفة أو المجموعة. | |||
المعامل الثاني هو المجموعة أو المصفوفة التي ستُكرَّر بينما المعامل الثالث هو اسم المتغيّر التي سيخصّص لحلقة التكرار الحالية في الواجهة. فعلى سبيل المثال، إن كنت تقوم بالتكرار في مصفوفة أعمال | </syntaxhighlight>المعامل الأول هو الواجهة الجزئية التي ستُظهَر لكل عنصر من المصفوفة أو المجموعة. | ||
يمكن أيضًا تمرير معامل رابع للتعليمة @each. يحدّد هذا المعامل الواجهة التي يجب إظهارها في حال كانت المصفوفة الممرّرة فارغة: | |||
المعامل الثاني هو المجموعة أو المصفوفة التي ستُكرَّر بينما المعامل الثالث هو اسم المتغيّر التي سيخصّص لحلقة التكرار الحالية في الواجهة. فعلى سبيل المثال، إن كنت تقوم بالتكرار في مصفوفة أعمال <code>jobs</code>، عادة ستصل إلى كل عمل عن طريق متغيّر <code>job</code> في الواجهة الجزئية. يكون المفتاح لحلقة التكرار الحالية متاحا في المتغيّر <code>key</code> من الواجهة الجزئية. | |||
يمكن أيضًا تمرير معامل رابع للتعليمة <code>@each</code>. يحدّد هذا المعامل الواجهة التي يجب إظهارها في حال كانت المصفوفة الممرّرة فارغة: <syntaxhighlight lang="html"> | |||
@each('view.name', $jobs, 'job', 'view.empty') | @each('view.name', $jobs, 'job', 'view.empty') | ||
المكادس (Stacks) | </syntaxhighlight>ملاحظة: الواجهات المُظهَرة باستخدام التعليمة <code>@each</code> ترث متغيّرات الواجهة الأم. إن كانت المتغيّرات إجباريةً في الواجهة اابن، فيجب استخدام الموجّه <code>@foreach</code> و <code>@include</code> بدًلا عن <code>each@</code>. | ||
== المكادس (Stacks) == | |||
يسمح Blade باستخدام مكادس (stacks) التي يمكن إظهارها في أماكن أخرى في الواجهات أو التخطيطات. يكون هذا مفيدًا في حالة تعريف مكتبة JavaScript ضرورية للواجهات الأبناء: | يسمح Blade باستخدام مكادس (stacks) التي يمكن إظهارها في أماكن أخرى في الواجهات أو التخطيطات. يكون هذا مفيدًا في حالة تعريف مكتبة JavaScript ضرورية للواجهات الأبناء: | ||
<syntaxhighlight lang="php"> | |||
@push('scripts') | @push('scripts') | ||
<script src="/example.js"></script> | |||
@endpush | @endpush | ||
يمكنك الدفع إلى المكدس مرّات عديدة ثمّ لإظهار محتوى المكدس الكامل، يُمرَّر اسم المكدس كمعامل للتعليمة @stack: | </syntaxhighlight> | ||
يمكنك الدفع إلى المكدس مرّات عديدة ثمّ لإظهار محتوى المكدس الكامل، يُمرَّر اسم المكدس كمعامل للتعليمة <code>@stack</code>: | |||
<syntaxhighlight lang="html+php"> | |||
<head> | <head> | ||
<!-- Head | <!-- Head محتويات قسم --> | ||
@stack('scripts') | @stack('scripts') | ||
</head> | </head> | ||
إذا أردت إضافة محتوى لبداية المكدس، يمكن استعمال التعليمة @prepend: | </syntaxhighlight> | ||
إذا أردت إضافة محتوى لبداية المكدس، يمكن استعمال التعليمة <code>@prepend</code>: | |||
<syntaxhighlight lang="php"> | |||
@push('scripts') | @push('scripts') | ||
This will be second... | |||
@endpush | @endpush | ||
// | // لاحقا | ||
@prepend('scripts') | |||
This will be first... | |||
@endprepend | @endprepend | ||
حقن الخدمات (Service Injection) | </syntaxhighlight> | ||
تُستخدَم التعليمة @inject لجلب خدمة من حاوية الخدمات. المعامل الأول المُمرَّر للتعيمة هو اسم المتغيّر التي سيحتوي الخدمة بينما المعامل الثاني هو اسم الصنف أو الواجهة للخدمة: | |||
== حقن الخدمات (Service Injection) == | |||
تُستخدَم التعليمة <code>@inject</code> لجلب خدمة من حاوية الخدمات. المعامل الأول المُمرَّر للتعيمة هو اسم المتغيّر التي سيحتوي الخدمة بينما المعامل الثاني هو اسم الصنف أو الواجهة للخدمة: | |||
<syntaxhighlight lang="html+php"> | |||
@inject('metrics', 'App\Services\MetricsService') | @inject('metrics', 'App\Services\MetricsService') | ||
<div> | <div> | ||
Monthly Revenue: | Monthly Revenue: {{ $metrics->monthlyRevenue() }}. | ||
</div> | </div> | ||
</syntaxhighlight> | |||
يسمح Blade بتعريف تعليمات خاصّة باستعمال التابع directive. عندما يلاقي معالج Blade تعليمات خاصّة فإنّه سينجز دالة رد النداء (callback) بالتعبير الذي تحتويه التعليمة. | == تمديد Blade == | ||
سنُنشِئ في المثال التالي تعليمةً | يسمح Blade بتعريف تعليمات خاصّة باستعمال التابع <code>directive</code>. عندما يلاقي معالج Blade تعليمات خاصّة فإنّه سينجز دالة رد النداء (callback) بالتعبير الذي تحتويه التعليمة. سنُنشِئ في المثال التالي تعليمةً <code>@datetime($var)</code> التي تقبل المعامل <code>var$</code> كنسخة من الصنف <code>DateTime</code>: | ||
<syntaxhighlight lang="php"> | |||
<?php | <?php | ||
سطر 486: | سطر 513: | ||
{ | { | ||
/** | /** | ||
* | * .تحميل أوّلي لتسجيل الخدمات | ||
* | * | ||
* @return void | * @return void | ||
سطر 498: | سطر 525: | ||
/** | /** | ||
* | * .تسجيل الارتباطات في الحاوية | ||
* | * | ||
* @return void | * @return void | ||
سطر 507: | سطر 534: | ||
} | } | ||
} | } | ||
كما في المثال السابق، يُربَط التابع format بأي عبارة مُمرَّرة للتعليمة. لذا فإنّ النتيجة المُولَّدة من التعليمة هي: | </syntaxhighlight> | ||
كما في المثال السابق، يُربَط التابع <code>format</code> بأي عبارة مُمرَّرة للتعليمة. لذا فإنّ النتيجة المُولَّدة من التعليمة هي:<syntaxhighlight lang="php"> | |||
<?php echo ($var)->format('m/d/Y H:i'); ?> | <?php echo ($var)->format('m/d/Y H:i'); ?> | ||
ملاحظة: بعد تغيير طريقة عمل التعليمة يجب حذف الواجهات المخزّنة مؤقتًا عن طريق أمر artisan التالي: | </syntaxhighlight> | ||
ملاحظة: بعد تغيير طريقة عمل التعليمة يجب حذف الواجهات المخزّنة مؤقتًا عن طريق أمر <code>artisan</code> التالي: | |||
<syntaxhighlight lang="php"> | |||
view:clear | view:clear | ||
تخصيص العبارات الشرطية | </syntaxhighlight> | ||
تعريف موجّهات مخصّصة أكثر تعقيدًا بكثير من تعريف عبارات شرطيّة مخصّصة. لهذا يُوفّر Blade التابع Blade::if للتعريف السريع لتعليمات شرطية مخصصة. على سبيل المثال، لنصنع تعليمةً شرطيةً تتثبّت من البيئة الحالية للتطبيق. يمكن وضع التعريف في التابع boot في AppServiceProvider: | |||
=== تخصيص العبارات الشرطية === | |||
تعريف موجّهات مخصّصة أكثر تعقيدًا بكثير من تعريف عبارات شرطيّة مخصّصة. لهذا يُوفّر Blade التابع <code>Blade::if</code> للتعريف السريع لتعليمات شرطية مخصصة. على سبيل المثال، لنصنع تعليمةً شرطيةً تتثبّت من البيئة الحالية للتطبيق. يمكن وضع التعريف في التابع <code>boot</code> في <code>AppServiceProvider</code>:<syntaxhighlight lang="php"> | |||
use Illuminate\Support\Facades\Blade; | use Illuminate\Support\Facades\Blade; | ||
/** | /** | ||
* .تحميل أوّلي لتسجيل الخدمات | |||
* | |||
* @return void | |||
public function boot() | */ | ||
public function boot() { | |||
Blade::if('env', function ($environment) { | |||
return app()->environment($environment); | |||
}); | |||
} | } | ||
</syntaxhighlight> | |||
بعد التعريف، يمكن استعمال الصيغة الشرطية المخصوصة بسهولة في باقي القالب: | بعد التعريف، يمكن استعمال الصيغة الشرطية المخصوصة بسهولة في باقي القالب: | ||
<syntaxhighlight lang="html"> | |||
@env('local') | @env('local') | ||
// ...التطبيق في البيئة المحلية | |||
@elseenv('testing') | @elseenv('testing') | ||
// ...التطبيق في بيئةالاختبار | |||
@else | @else | ||
// ...التطبيق ليس في البيئة المحلية وليس في بيئة الاختبار | |||
@endenv | @endenv | ||
</syntaxhighlight> | |||
مصادر | == مصادر == | ||
* [https://laravel.com/docs/5.6/blade صفحة Blade في توثيق Laravel الرسمي.] | |||
[[تصنيف:Laravel|{{SUBPAGENAME}}]] | |||
[[تصنيف:Laravel Frontend|{{SUBPAGENAME}}]] |
المراجعة الحالية بتاريخ 13:29، 23 أكتوبر 2018
مقدمة
يقدم Laravel محرّك قولبةٍ بسيطاً لكن قويٌّ و فعّال هو Blade. على خلاف محرّكات PHP أخرى، لا يمنع Blade المستخدم من استعمال شيفرات PHP في الواجهة، بل إنّه يحوِِّل صفحات Blade إلى شيفرة PHP ويخزِّنها تخزينًا مؤقتًا إلى حين تغييرها. ممّا يعني أنّ Blade لا يتطلب أيّ جهد أو وقت إضافي من التطبيق. تنتهي صفحات Blade بالامتداد blade.php
. وتوجد عادة في مجلد resources/views
.
توريث القوالب
تعريف التخطيط
إنّ من الفوائد الأساسية لاستخدام Blade هي توريث القوالب (template inheritance) واستخدام الأقسام (sections). في البداية، سنأخذ مثالًا بسيطًا لصفحة master رئيسية. ولمّا كانت معظم تطبيقات الويب تحافظ على تخطيط عام في مختلف الصفحات، فإنَّ من الملائم تعريف هذا التخطيط العامّ في واجهة 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
@yield('content')
</body>
</html>
يمكنك الملاحظة أنّ الكود يحتوي على عناصر HTML التقليدية، لكنّه يحتوي أيضًا على التعليمتين @section
و @yield
. تُعرِّف التعليمة @section
قسمًا أو جزءًا لإضافة المحتوى، بينما تعرض التعليمة @yield
محتوى قسم معيّن.
أمّا الآن بعد أن عرّفنا تخطيطًا عامًّا للتطبيق، فسنصنع الصفحات التي سترث هذا التخطيط.
تمديد التخطيط
عند إنشاء واجهة ابن جديدة، تُستخدَم التعليمة @extends
لتحديد أي التخطيطات يجب على هذه الواجهة أن ترث. بإمكان الواجهات التي ترث تخطيطًا أن تضيف محتوى لأحد أقسامه باستخدام تعليمات @section
. كما رأينا سابقًا، يمكن إظهار هذا المحتوى باستخدام التعليمة @yield
.
<!-- resources/views/child.blade.php موجودة في -->
@extends('layouts.app')
@section('title', 'Page Title')
@section('sidebar')
@parent
<p>يُضاف هذا للقائمة الرئيسية الجانبية.</p>
@endsection
@section('content')
This is my body content.
@endsection
في المثال السابق، يستخدم القسم sidebar التعليمة @parent
ليمدد (بدل إعادة تعريف) محتوى القسم في التخطيط. ستُعوَّض التعليمة @parent
بمحتواها من التخطيط عند استدعاء الواجهة.
ملاحظة: على عكس المثال الأول، انتهى القسم sidebar هنا بالتعليمة @endsection
بدل @show
. تُستعمَل التعليمة @endsection
للإعلان عن انتهاء قسمٍ ما، بينما تُستعمل @show
لإعلان انتهاء قسم وإظهاره مباشرة.
بالإمكان إعادة واجهات Blade مباشرة من صفحة المسارات وذلك باستخدام التابع المساعد العام .show
Route::get('blade', function () {
return view('child');
});
المكونات والأماكن (Components & Slots)
تُقدِم المكونات و الأماكن فوائد مشابهة لتلك التي تُقدمها الأقسام والتخطيطات و قد يجدها البعض أسهل في الفهم. في البداية. سنبدأ بصناعة مكون قابل لإعادة الاستخدام "alert" لاستخدامه في كامل التطبيق:
<!-- /resources/views/alert.blade.php -->
<div class="alert alert-danger">
{{ $slot }}
</div>
سوف يتضمّن المتغيّر slot$
المحتوى الذي نريد إضافته إلى المكوّن. أمّا لصناعة المكوّن، يمكن استخدام الموجّه component@
:
@component('alert')
Whoops! Something went wrong!
@endcomponent
في بعض الأحيان، من المفيد تعريف عدّة أماكن (solts) لمكوّن واحد. لنقم على سبيل المثال بتغيير 'alert' التي أنشأناها لتسمح بإضافة 'title'. تُظهَر الأماكن المعنونة عن طريق استعمال متغيّرات تحمل نفس الأسماء:
@component('alert')
@slot('title')
Forbidden
@endslot
You are not allowed to access this resource!
@endcomponent
تمرير بيانات إضافية للمكونات
قد نحتاج في بعض الأحيان إلى تمرير بيانات إضافية لأحدى المكوّنات، ولهذا بالإمكان تمرير مصفوفة معلومات كمعامل ثاني للتعليمة @component
. كل المعلومات المُمَرّرة ستكون متاحة لقالب المكوّن على شكل متغيّرات:
@component('alert', ['foo' => 'bar'])
...
@endcomponent
أسماء بديلة للمكوّن
إن كانت المكوّنات محفوظة في ملف داخلي، بالإمكان إعطاؤها أسماءً بديلةً لتسهيل استخدامها. على سبيل المثال، إن كان المكوّن موجودًا في resources/views/components/alert.blade.php
فسيكون بالإمكان استخدام التابع component
لإعطاء إسم بديل للمكون components.alert
ليصبح alert
. في العادة يمكن القيام بهذا في التابع boot
في صفحة AppServiceProvider
use Illuminate\Support\Facades\Blade;
Blade::component('components.alert','alert');
بعد إعطاء الاسم البديل للمكوّن، يمكن استخدامه عن طريق تعليمة:
@alert(['type' => 'danger'])
You are not allowed to access this resource!
@endalert
يمكن حذف المعامل إن لم تكن له حاجة:
@alert
You are not allowed to access this resource!
@endalert
إظهار البيانات
يمكن إظهار البيانات المُمرّرة إلى الواجهة عن طريق إحاطة المتغيّرة بأقواس معقوفة. على سبيل المثال، لدينا المسار التالي:
Route::get('greeting', function () {
return view('welcome', ['name' => 'Samantha']);
});
يُعرَض محتوى المتغيّر name
كما يلي:
Hello, {{ $name }}
بالطبع لستَ محدودًا بإظهار محتوى المتغيّرات المُمرّرة للواجهة، بل يمكن أيًضا إظهار نتائج دوال PHP، بل يمكن وضع أي كود PHP
The current UNIX timestamp is {{ time() }}
ملاحظة: ستُمرَّر محتويات الأقواس المعقوفة {{ }} تلقائيًا إلى دالة htmlspecialchars
PHP للحد من هجمات XSS.
عرض البيانات غير المهرّبة
في العادة، ستُمرَّر بيانات الأقواس المعقّفة إلى الدالة htmlspecialchars
للحد من هجمات XSS. إن أردت أن تكون البيانات مهربةً (escaped) ، فيمكن استعمال التركيب التالي:
Hello, {!! $name !!}
كن حذرًا عند عرض بيانات مقدّمة من المستخدم! استخدم دائمًا البيانات المُهرَّبة بين أقواس معقوفة للحد من الهجمات.
عرض صيغة JSON
في بعض الأحيان، قد نمرّر مصفوفة بيانات بُغية عرضها على هيئة صيغة JSON لتعريف متغير JavaScript. على سبيل المثال:
<script>
var app = <?php echo json_encode($array); ?>;
</script>
لكن عوض استخدام الدالة json_encode
، يمكن استخدام التعليمة @json
:
<script>
var app = @json($array);
</script>
ترميز كائن 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 {
/**
* .التمهيد لخدمات التطبيق
*
* @return void
*/
public function boot()
{
Blade::withoutDoubleEncoding();
}
}
استعمال Blade مع إطارات JavaScript
لمّا كانت العديد من إطارات JavaScript تستعمل الأقواس المعقوفة للتعبير على أن جملة معيّنة يجب أن تظهر في المتصفح، يمكن استخدام الرمز @ لإعلام محرّك الإظهار في Blade بأن الجملة يجب أن تبقى كما هي دون تغيير:
<h1>Laravel</h1>
Hello, @{{ name }}.
في هذا المثال، سيحذف blade الرمز @ لكنه سيبقي على الجملة {{name}} كما هي ممّا سيسمح لها بأن تُعالَج في إطار JavaScript الذي تستخدمه.
التعليمة @verbatim
إن كنت تعرض متغيرات JavaScript في قسم كبير من الشيفرة يمكنك إحاطة شيفرة HTML بالتعليمة @verbatim
حتّى لا تضطر لإسباق كل تعليمة عرض بالرمز @:
@verbatim
<div class="container">
Hello, {{ name }}.
</div>
@endverbatim
بنى التحكم
بالإضافة لتوريث القوالب وعرض البيانات يُقدّم Blade اختصارات مفيدة لبنى تحكّم PHP الشائعة مثل عبارات التحكّم وحلقات التكرار. هذه الاختصارات توفّر طريقة سهلة ومقتضبة لاستخدام بنى التحكّم في حين تبقى مألوفةً ومشابهةً لنظيراتها من تعابير PHP.
العبارة if
يمكنك صياغة البنية if باستخدام التعليمات @if
، و @elseif
، و @else
، و @endif
. هذه التعليمات تعمل تمامًا مثل نظيراتها في PHP.
@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
إضافة للموجّهات الشَّرطية التي ذكرناها، يُوفّر Blade التعليمتين @isset
و@empty
كاختصارين لنظيريهما من دوال PHP:
@isset($records)
// معرّف وذو قيمة $records
@endisset
@empty($records)
// "empty" أصبح $records
@endempt
تعليمات الاستيثاق
تُستخدم التعليمات @auth
و @guest
للتحقّق بسرعة من إذا ما كان المستخدم مسجلًا الدخول أو كان زائرًا:
@auth
// ...هذا المستخدم مسجّل الدخول
@endauth
@guest
// ...هذا المستخدم غير مسجّل الدخول
@endguest
إذا لزم الأمر، يمكن استخدام حارس الاستيثاق (authentication guard) والذي يجب التحقق منه عند استعمال إحدى التعليمتين @auth
أو @guest
:
@auth('admin')
// ...هذا المستخدم مسجّل الدخول
@endauth
@guest('admin')
// ...هذا المستخدم غير مسجّل الدخول
@endguest
تعليمات الأقسام
يمكن التحقّق إذا كان القسم به محتوى أم لا باستخدام التعليمة @hassection
:
@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 الحلقيّة. تعمل هذه التعليمات بطريقة مشابهة لنظيرتها في 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 ($users as $user)
@if ($user->type == 1)
@continue
@endif
{{$user->name }}
@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
ويكون جاهزًا للاستخدام. يوفّر هذا المتغيّر عدّة معلومات مفيدة مثل إن كان التكرار الحالي الأول أو الأخير في الحلقة:
@foreach ($users as $user)
@if ($loop->first)
This is the first iteration.
@endif
@if ($loop->last)
This is the last iteration.
@endif
This is user {{$user->id }}
@endforeach
عندما تكون في حلقات متداخلة كليًا، يمكن الولوج للمتغيّر $loop
الخاصّ بالحلقة الأم أو الحلقة الخارجية باستخدام الخاصّية parent
:
@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
يحتوي أيضًا على عدّة خاصيات أخرى مفيدة:
الخاصّية | التعريف |
---|---|
loop->index$
|
فهرس حلقة التكرار الحالية (يبدأ من 0). |
loop->iteration$
|
حلقة التكرار الحالية (تبدأ من 1). |
loop->remaining$
|
عدد حلقات التكرار المتبقية. |
loop->count$
|
العدد الكلّي للعناصر في مصفوفة المعلومات المكرّرة. |
loop->first$
|
إن كانت حلقة التكرار الحاليّة هي الأولى أم لا. |
loop->last$
|
إن كانت حلقة التكرار الحالية هي الأخيرة أم لا. |
loop->depth$
|
عمق التداخل في الحلقة الحالية. |
loop->parent$
|
في حالة الحلقات المتداخلة، المتغيّر $loop للحلقة الأم.
|
التعليقات
يسمح Blade بإضافة تعليقات في الواجهات. على عكس تعليقات HTML، فإن تعليقات Blade ليست مُضمّنة في شيفرة HTML الناتج من التطبيق:
{{-- هذا التعليق لن يظهر في الصفحة النهائية HTML --}}
PHP
من المفيد في بعض الأحيان تضمين كود PHP في الواجهة. يمكن استخدام الموجّه php@
لتنفيذ مقطع من كود PHP في القالب:
@php
//
@endphp
ملاحظة: رغم أنّ Blade يوفّر هذه الخاصّية إلّا أنّ الإكثار من استخدامها يعني أن القالب يحتوي على الكثير من التحليل المنطقي.
تضمين الواجهات الفرعية
تسمح التعليمة @include
بتضمين واجهة في واجهة أخرى. كل المتغيّرات المتاحة للواجهة الأم متاحة أيضًا للواجهة المضمّنة:
<div>
@include('shared.errors')
<form>
<!-- Form محتويات قسم -->
</form>
</div>
بالإضافة إلى أنها سترث كل بيانات الواجهة الأم، يمكن أيضا تمرير مصفوفة بيانات إضافية إلى الواجهة المضمّنة:
@include('view.name', ['some' => 'data'])
بالطبع إذا ضمّنت واجهة غير موجودة سيصدر Laravel خطأً. إذا أردت تضمين واجهة لست متأكدًا من وجودها، يمكنك استخدام التعليمة @includeif
:
@includeWhen($boolean, 'view.name', ['some' => 'data'])
لتضمين الواجهة الأولى الموجودة من مصفوفة واجهات، يمكن استخدام التعليمة @includeFirst
:
@includeFirst(['custom.admin', 'admin'], ['some' => 'data'])
تحذير: من المفضّل تجنّب استخدام الثّوابت _DIR_
و _FILE_
في الواجهات لأنها تشير إلى أماكن وجود الواجهات المترجمة والمخزّنة مؤقتًا.
إظهار الواجهات في المجموعات
بالإمكان دمج التضمين و الحلقات في سطر واحد باستخدام التعليمة each@
:
@each('view.name', $jobs, 'job')
المعامل الأول هو الواجهة الجزئية التي ستُظهَر لكل عنصر من المصفوفة أو المجموعة.
المعامل الثاني هو المجموعة أو المصفوفة التي ستُكرَّر بينما المعامل الثالث هو اسم المتغيّر التي سيخصّص لحلقة التكرار الحالية في الواجهة. فعلى سبيل المثال، إن كنت تقوم بالتكرار في مصفوفة أعمال jobs
، عادة ستصل إلى كل عمل عن طريق متغيّر job
في الواجهة الجزئية. يكون المفتاح لحلقة التكرار الحالية متاحا في المتغيّر key
من الواجهة الجزئية.
يمكن أيضًا تمرير معامل رابع للتعليمة @each
. يحدّد هذا المعامل الواجهة التي يجب إظهارها في حال كانت المصفوفة الممرّرة فارغة:
@each('view.name', $jobs, 'job', 'view.empty')
ملاحظة: الواجهات المُظهَرة باستخدام التعليمة @each
ترث متغيّرات الواجهة الأم. إن كانت المتغيّرات إجباريةً في الواجهة اابن، فيجب استخدام الموجّه @foreach
و @include
بدًلا عن each@
.
المكادس (Stacks)
يسمح Blade باستخدام مكادس (stacks) التي يمكن إظهارها في أماكن أخرى في الواجهات أو التخطيطات. يكون هذا مفيدًا في حالة تعريف مكتبة JavaScript ضرورية للواجهات الأبناء:
@push('scripts')
<script src="/example.js"></script>
@endpush
يمكنك الدفع إلى المكدس مرّات عديدة ثمّ لإظهار محتوى المكدس الكامل، يُمرَّر اسم المكدس كمعامل للتعليمة @stack
:
<head>
<!-- Head محتويات قسم -->
@stack('scripts')
</head>
إذا أردت إضافة محتوى لبداية المكدس، يمكن استعمال التعليمة @prepend
:
@push('scripts')
This will be second...
@endpush
// لاحقا
@prepend('scripts')
This will be first...
@endprepend
حقن الخدمات (Service Injection)
تُستخدَم التعليمة @inject
لجلب خدمة من حاوية الخدمات. المعامل الأول المُمرَّر للتعيمة هو اسم المتغيّر التي سيحتوي الخدمة بينما المعامل الثاني هو اسم الصنف أو الواجهة للخدمة:
@inject('metrics', 'App\Services\MetricsService')
<div>
Monthly Revenue: {{ $metrics->monthlyRevenue() }}.
</div>
تمديد Blade
يسمح 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
{
/**
* .تحميل أوّلي لتسجيل الخدمات
*
* @return void
*/
public function boot()
{
Blade::directive('datetime', function ($expression) {
return "<?php echo ($expression)->format('m/d/Y H:i'); ?>";
});
}
/**
* .تسجيل الارتباطات في الحاوية
*
* @return void
*/
public function register()
{
//
}
}
كما في المثال السابق، يُربَط التابع format
بأي عبارة مُمرَّرة للتعليمة. لذا فإنّ النتيجة المُولَّدة من التعليمة هي:
<?php echo ($var)->format('m/d/Y H:i'); ?>
ملاحظة: بعد تغيير طريقة عمل التعليمة يجب حذف الواجهات المخزّنة مؤقتًا عن طريق أمر artisan
التالي:
view:clear
تخصيص العبارات الشرطية
تعريف موجّهات مخصّصة أكثر تعقيدًا بكثير من تعريف عبارات شرطيّة مخصّصة. لهذا يُوفّر Blade التابع Blade::if
للتعريف السريع لتعليمات شرطية مخصصة. على سبيل المثال، لنصنع تعليمةً شرطيةً تتثبّت من البيئة الحالية للتطبيق. يمكن وضع التعريف في التابع boot
في AppServiceProvider
:
use Illuminate\Support\Facades\Blade;
/**
* .تحميل أوّلي لتسجيل الخدمات
*
* @return void
*/
public function boot() {
Blade::if('env', function ($environment) {
return app()->environment($environment);
});
}
بعد التعريف، يمكن استعمال الصيغة الشرطية المخصوصة بسهولة في باقي القالب:
@env('local')
// ...التطبيق في البيئة المحلية
@elseenv('testing')
// ...التطبيق في بيئةالاختبار
@else
// ...التطبيق ليس في البيئة المحلية وليس في بيئة الاختبار
@endenv