الفرق بين المراجعتين لصفحة: «Laravel/blade»

من موسوعة حسوب
أنشأ الصفحة ب'<noinclude>{{DISPLAYTITLE:قوالب Blade }}</noinclude> مقدمة يقدم Laravel محرّك قولبةٍ بسيطاً لكن قويٌّ و فعّال هو Blade....'
 
ط استبدال النص - '\[\[تصنيف:(.*)\]\]' ب'{{SUBPAGENAME}}'
 
(29 مراجعة متوسطة بواسطة مستخدمين اثنين آخرين غير معروضة)
سطر 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>.


مقدمة
== توريث القوالب ==


يقدم Laravel محرّك قولبةٍ بسيطاً لكن قويٌّ و فعّال هو Blade. على خلاف محرّكات PHP أخرى، لا يمنع Blade المستخدم من استعمال شيفرات PHP في الواجهة، بل إنّه يحوِِّل صفحات Blade إلى شيفرة PHP ويخزِّنها تخزينًا مؤقتًا إلى حين تغييرها. ممّا يعني أنّ Blade لا يتطلب أيّ جهد أو وقت إضافي من التطبيق. تنتهي صفحات Blade بالامتداد blade.php. و توجد عادة في مجلد resources/views.
=== تعريف التخطيط ===
إنّ من الفوائد الأساسية لاستخدام Blade هي توريث القوالب (template inheritance) واستخدام الأقسام (sections). في البداية، سنأخذ مثالًا بسيطًا لصفحة master رئيسية. ولمّا كانت معظم تطبيقات الويب تحافظ على تخطيط عام في مختلف الصفحات، فإنَّ من الملائم تعريف هذا التخطيط العامّ في واجهة Blade:<syntaxhighlight lang="html">
<!--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>
إنّ من الفوائد الأساسية لاستخدام Blade هي توريث القوالب (template inheritance) واستخدام الأقسام (sections). في البداية، سنأخذ مثالًا بسيطًا لصفحة master رئيسية. ولمّا كانت معظم تطبيقات الويب تحافظ على تخطيط عام في مختلف الصفحات، فإنَّ من الملائم تعريف هذا التخطيط العامّ في واجهة Blade:
</syntaxhighlight>يمكنك الملاحظة أنّ الكود يحتوي على عناصر [[HTML]] التقليدية، لكنّه يحتوي أيضًا على التعليمتين ‎<code>@section</code> و ‎<code>@yield</code>. تُعرِّف التعليمة ‎<code>@section</code> قسمًا أو جزءًا لإضافة المحتوى، بينما تعرض التعليمة ‎<code>@yield</code> محتوى قسم معيّن.
<!-- Stored in 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 محتوى قسم معيّن.
أمّا الآن بعد أن عرّفنا تخطيطًا عامًّا للتطبيق، فسنصنع الصفحات التي سترث هذا التخطيط.
أمّا الآن بعد أن عرّفنا تخطيطًا عامًّا للتطبيق، فسنصنع الصفحات التي سترث هذا التخطيط.


تمديد التخطيط
=== تمديد التخطيط ===
 
عند إنشاء واجهة ابن جديدة، تُستخدَم التعليمة ‎<code>@extends</code> لتحديد أي التخطيطات يجب على هذه الواجهة أن ترث. بإمكان الواجهات التي ترث تخطيطًا أن تضيف محتوى لأحد أقسامه باستخدام تعليمات ‎<code>@section</code>. كما رأينا سابقًا، يمكن إظهار هذا المحتوى باستخدام التعليمة ‎<code>@yield</code>. <syntaxhighlight lang="php">
عند إنشاء واجهة ابن جديدة، تُستخدَم التعليمة ‎@extends لتحديد أي التخطيطات يجب على هذه الواجهة أن ترث. بإمكان الواجهات التي ترث تخطيطًا أن تضيف محتوى لأحد أقسامه باستخدام تعليمات ‎@section. كما رأينا سابقًا، يمكن إظهار هذا المحتوى باستخدام التعليمة ‎@yield.  
<!-- resources/views/child.blade.php موجودة في -->
<!-- Stored in resources/views/child.blade.php -->


@extends('layouts.app')
@extends('layouts.app')
سطر 39: سطر 34:


@section('sidebar')
@section('sidebar')
    @parent


    <p>يُضاف هذا للقائمة الرئيسية الجانبية.</p>
  @parent
 
<p>يُضاف هذا للقائمة الرئيسية الجانبية.</p>
@endsection
@endsection


@section('content')
@section('content')
    <p>This is my body content.</p>
 
This is my body content.
@endsection
@endsection
في المثال السابق، يستخدم القسم 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
بالإمكان إعادة واجهات Blade مباشرة من صفحة المسارات وذلك باستخدام التابع المساعد العام ‎.<code>show</code><syntaxhighlight lang="php">
Route::get('blade', function () {
Route::get('blade', function () {
    return view('child');
 
  return view('child');
 
});
});
المكونات والأماكن (Components & Slots)
</syntaxhighlight>


تُقدِم المكونات و الأماكن فوائد مشابهة لتلك التي تُقدمها الأقسام والتخطيطات و قد يجدها البعض أسهل في الفهم. في البداية. سنبدأ بصناعة مكون قابل لإعادة الاستخدام "alert"  لاستخدامه في كامل التطبيق:
== المكونات والأماكن (Components & Slots) ==
تُقدِم المكونات و الأماكن فوائد مشابهة لتلك التي تُقدمها الأقسام والتخطيطات و قد يجدها البعض أسهل في الفهم. في البداية. سنبدأ بصناعة مكون قابل لإعادة الاستخدام "alert"  لاستخدامه في كامل التطبيق:<syntaxhighlight lang="php">
<!-- /resources/views/alert.blade.php -->
<!-- /resources/views/alert.blade.php -->


سطر 63: سطر 63:
     {{ $slot }}
     {{ $slot }}
</div>
</div>
سوف يتضمّن المتغيّر {{slot$}} المحتوى الذي نريد إضافته إلى المكوّن. أمّا لصناعة المكوّن، يمكن استخدام الموجّه component@:
</syntaxhighlight>سوف يتضمّن المتغيّر <code>slot$</code> المحتوى الذي نريد إضافته إلى المكوّن. أمّا لصناعة المكوّن، يمكن استخدام الموجّه <code>component@</code>:<syntaxhighlight lang="php">
@component('alert')
  Whoops! Something went wrong!
@endcomponent
</syntaxhighlight>


في بعض الأحيان، من المفيد تعريف عدّة أماكن (solts) لمكوّن واحد. لنقم على سبيل المثال بتغيير 'alert' التي أنشأناها لتسمح بإضافة 'title'. تُظهَر الأماكن المعنونة عن طريق استعمال متغيّرات تحمل نفس الأسماء:<syntaxhighlight lang="php">
@component('alert')
@component('alert')
    <strong>Whoops!</strong> Something went wrong!@endcomponent


في بعض الأحيان، من المفيد تعريف عدّة أماكن (solts) لمكوّن واحد. لنقم على سبيل المثال بتغيير 'alert' التي أنشأناها لتسمح بإضافة 'title'. تُظهَر الأماكن المعنونة عن طريق استعمال متغيّرات تحمل نفس الأسماء:
  @slot('title')
      Forbidden
  @endslot
  You are not allowed to access this resource!


@component('alert')
    @slot('title')
        Forbidden
    @endslot
    You are not allowed to access this resource!
@endcomponent
@endcomponent
تمرير بيانات إضافية للمكونات
</syntaxhighlight>
 
قد نحتاج في بعض الأحيان إلى تمرير بيانات إضافية لأحدى المكوّنات، ولهذا بالإمكان تمرير مصفوفة معلومات كمعامل ثاني للتعليمة ‎@component. كل المعلومات المُمَرّرة ستكون متاحة لقالب المكوّن على شكل متغيّرات:


=== تمرير بيانات إضافية للمكونات ===
قد نحتاج في بعض الأحيان إلى تمرير بيانات إضافية لأحدى المكوّنات، ولهذا بالإمكان تمرير مصفوفة معلومات كمعامل ثاني للتعليمة ‎<code>@component</code>. كل المعلومات المُمَرّرة ستكون متاحة لقالب المكوّن على شكل متغيّرات:<syntaxhighlight lang="php">
@component('alert', ['foo' => 'bar'])
@component('alert', ['foo' => 'bar'])
     ...
     ...
@endcomponent
@endcomponent


أسماء بديلة للمكوّن
</syntaxhighlight>


إن كانت المكوّنات محفوظة في ملف داخلي، بالإمكان إعطاؤها أسماءً بديلةً لتسهيل استخدامها. على سبيل المثال، إن كان المكوّن موجودًا في resources/views/components/alert.blade.php فسيكون بالإمكان استخدام التابع component لإعطاء إسم بديل للمكون components.alert ليصبح alert. في العادة يمكن القيام بهذا في التابع boot في صفحة AppServiceProvider
=== أسماء بديلة للمكوّن ===
إن كانت المكوّنات محفوظة في ملف داخلي، بالإمكان إعطاؤها أسماءً بديلةً لتسهيل استخدامها. على سبيل المثال، إن كان المكوّن موجودًا في <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">
use Illuminate\Support\Facades\Blade;
use Illuminate\Support\Facades\Blade;
Blade::component('components.alert','alert');
</syntaxhighlight>


Blade::component(‘components.alert’,’alert’);
بعد إعطاء الاسم البديل للمكوّن، يمكن استخدامه عن طريق تعليمة:<syntaxhighlight lang="php">
بعد إعطاء الاسم البديل للمكوّن، يمكن استخدامه عن طريق تعليمة:
@alert(['type' => 'danger'])
@alert(['type' => 'danger'])
    You are not allowed to access this resource!
 
  You are not allowed to access this resource!
 
@endalert
@endalert
يمكن حذف المعامل إن لم تكن له حاجة:
</syntaxhighlight>


يمكن حذف المعامل إن لم تكن له حاجة:<syntaxhighlight lang="php">
@alert
@alert
    You are not allowed to access this resource!
 
  You are not allowed to access this resource!
 
@endalert
@endalert
</syntaxhighlight>


إظهار البيانات  
== إظهار البيانات ==
يمكن إظهار البيانات المُمرّرة إلى الواجهة عن طريق إحاطة المتغيّرة بأقواس معقوفة. على سبيل المثال، لدينا المسار التالي:
يمكن إظهار البيانات المُمرّرة إلى الواجهة عن طريق إحاطة المتغيّرة بأقواس معقوفة. على سبيل المثال، لدينا المسار التالي:<syntaxhighlight lang="php">
Route::get('greeting', function () {
Route::get('greeting', function () {
    return view('welcome', ['name' => 'Samantha']);
 
  return view('welcome', ['name' => 'Samantha']);
 
});
});
يُعرَض محتوى المتغيّر name كما يلي:
</syntaxhighlight>
Hello, {{ $name }}.
 
بالطبع لستَ محدودًا بإظهار محتوى المتغيّرات المُمرّرة للواجهة، بل يمكن أيًضا إظهار نتائج دوال PHP، بل يمكن وضع أي كود PHP:
يُعرَض محتوى المتغيّر <code>name</code> كما يلي:<syntaxhighlight lang="php">
The current UNIX timestamp is {{ time() }}.
Hello, {{ $name }}
ملاحظة: ستُمرَّر محتويات الأقواس المعقوفة {{ }} تلقائيًا إلى دالة PHP htmlspecialchars للحد من هجمات XSS.
</syntaxhighlight>
عرض البيانات غير المهرّبة
 
في العادة، ستُمرَّر بيانات الأقواس المعقّفة إلى الدالة htmlspecialchars للحد من هجمات XSS. إن أردت أن تكون البيانات مهربةً (escaped) ، فيمكن استعمال التركيب التالي:
بالطبع لستَ محدودًا بإظهار محتوى المتغيّرات المُمرّرة للواجهة، بل يمكن أيًضا إظهار نتائج دوال PHP، بل يمكن وضع أي كود PHP<syntaxhighlight lang="php">
Hello, {!! $name !!}.
The current UNIX timestamp is {{ time() }}
</syntaxhighlight>
 
<nowiki>ملاحظة: ستُمرَّر محتويات الأقواس المعقوفة {{ }} تلقائيًا إلى دالة </nowiki><code>[[PHP/htmlspecialchars|htmlspecialchars]]</code> PHP للحد من هجمات XSS.
 
=== عرض البيانات غير المهرّبة ===
في العادة، ستُمرَّر بيانات الأقواس المعقّفة إلى الدالة <code>[[PHP/htmlspecialchars|htmlspecialchars]]</code> للحد من هجمات XSS. إن أردت أن تكون البيانات مهربةً (escaped) ، فيمكن استعمال التركيب التالي:<syntaxhighlight lang="php">
Hello, {!! $name !!}
</syntaxhighlight>
 
كن حذرًا عند عرض بيانات مقدّمة من المستخدم! استخدم دائمًا البيانات المُهرَّبة بين أقواس معقوفة للحد من الهجمات.
كن حذرًا عند عرض بيانات مقدّمة من المستخدم! استخدم دائمًا البيانات المُهرَّبة بين أقواس معقوفة للحد من الهجمات.


عرض صيغة JSON
=== عرض صيغة JSON ===
في بعض الأحيان، قد نمرّر مصفوفة بيانات بُغية عرضها على هيئة صيغة JSON لتعريف متغير [[JavaScript]]. على سبيل المثال:<syntaxhighlight lang="html+php">
<script>
 
  var app = <?php echo json_encode($array); ?>;


في بعض الأحيان، قد نمرّر مصفوفة بيانات بُغية عرضها على هيئة صيغة JSON لتعريف متغير JavaScript. على سبيل المثال:
<script>
    var app = <?php echo json_encode($array); ?>;
</script>
</script>
لكن عوض استخدام الدالة json_encode، يمكن استخدام التعليمة ‎@json:
</syntaxhighlight>
 
لكن عوض استخدام الدالة <code>json_encode</code>، يمكن استخدام التعليمة ‎<code>@json</code>:<syntaxhighlight lang="html+php">
<script>
<script>
    var app = @json($array);
 
  var app = @json($array);
 
</script>
</script>
ترميز كائن HTML
</syntaxhighlight>


في الحالة العاديّة، blade [والمساعد e بصفة أخص] يرمِّز كائنات HTML بصفة مضاعفة. إن أردت إيقاف الترميز المضاعف يمكنك استدعاء التابع Blade::withoutDoubleEncoding من التابع boot في الصفحة AppServiceProvider
=== ترميز كائن HTML ===
في الحالة العاديّة، blade [والمساعد e بصفة أخص] يرمِّز كائنات [[HTML]] بصفة مضاعفة. إن أردت إيقاف الترميز المضاعف يمكنك استدعاء التابع <code>Blade::withoutDoubleEncoding</code> من التابع <code>boot</code> في الصفحة AppServiceProvider:<syntaxhighlight lang="php">
<?php
<?php


namespace App\Providers;
namespace App\Providers;
use Illuminate\Support\Facades\Blade; use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider {


use Illuminate\Support\Facades\Blade;
  /**
use Illuminate\Support\ServiceProvider;
    * .التمهيد لخدمات التطبيق
    *
    * @return void
    */
  public function boot()
  {
      Blade::withoutDoubleEncoding();
  }


class AppServiceProvider extends ServiceProvider
{
    /**
    * Bootstrap any application services.
    *
    * @return void
    */
    public function boot()
    {
        Blade::withoutDoubleEncoding();
    }
}
}
استعمال Blade مع إطارات JavaScript
</syntaxhighlight>
لمّا كانت العديد من إطارات JavaScript تستعمل الأقواس المعقوفة للتعبير على أن جملة معيّنة يجب أن تظهر في المتصفح، يمكن استخدام الرمز @ لإعلام محرّك الإظهار في Blade بأن الجملة يجب أن تبقى كما هي دون تغيير
 
=== استعمال Blade مع إطارات [[JavaScript]] ===
لمّا كانت العديد من إطارات [[JavaScript]] تستعمل الأقواس المعقوفة للتعبير على أن جملة معيّنة يجب أن تظهر في المتصفح، يمكن استخدام الرمز @ لإعلام محرّك الإظهار في Blade بأن الجملة يجب أن تبقى كما هي دون تغيير:<syntaxhighlight lang="html+php">
 
<h1>Laravel</h1>
<h1>Laravel</h1>


Hello, @{{ name }}.
Hello, @{{ name }}.
في هذا المثال، سيحذف blade الرمز @ لكنه سيبقي على الجملة {{ name }} كما هي ممّا سيسمح لها بأن تُعالَج في إطار JavaScript الذي تستخدمه.
</syntaxhighlight>في هذا المثال، سيحذف blade الرمز @ لكنه سيبقي على الجملة <nowiki>{{name}}</nowiki> كما هي ممّا سيسمح لها بأن تُعالَج في إطار JavaScript الذي تستخدمه.


التعليمة ‎@verbatim
==== التعليمة <code>‎@verbatim</code> ====
إن كنت تعرض متغيرات JavaScript في قسم كبير من الشيفرة يمكنك إحاطة شيفرة HTML بالتعليمة ‎@verbatim حتّى لا تضطر لإسباق كل تعليمة عرض بالرمز @:
إن كنت تعرض متغيرات JavaScript في قسم كبير من الشيفرة يمكنك إحاطة شيفرة HTML بالتعليمة ‎<code>@verbatim</code> حتّى لا تضطر لإسباق كل تعليمة عرض بالرمز @:<syntaxhighlight lang="html+php">
@verbatim
@verbatim
     <div class="container">
     <div class="container">
سطر 162: سطر 190:
     </div>
     </div>
@endverbatim
@endverbatim
</syntaxhighlight>


بنى التحكم
== بنى التحكم ==
بالإضافة لتوريث القوالب وعرض البيانات يُقدّم Blade اختصارات مفيدة لبنى تحكّم [[PHP]] الشائعة مثل عبارات التحكّم وحلقات التكرار. هذه الاختصارات توفّر طريقة سهلة ومقتضبة لاستخدام بنى التحكّم في حين تبقى مألوفةً ومشابهةً لنظيراتها من تعابير PHP.


بالإضافة لتوريث القوالب وعرض البيانات يُقدّم blade اختصارات مفيدة لبنى تحكّم PHP الشائعة مثل عبارات التحكّم وحلقات التكرار. هذه الاختصارات توفّر طريقة سهلة ومقتضبة لاستخدام بنى التحكّم في حين تبقى مألوفةً ومشابهةً لنظيراتها من تعابير PHP.
=== العبارة if ===
يمكنك صياغة البنية if باستخدام التعليمات ‎<code>@if</code>، و ‎<code>@elseif</code>، و ‎<code>@else</code>، و ‎<code>@endif</code>. هذه التعليمات تعمل تمامًا مثل نظيراتها في [[PHP]].<syntaxhighlight lang="php">
@if (count($records) === 1)
 
  I have one record!


العبارة if
يمكنك صياغة البنية if باستخدام التعليمات ‎@if، و ‎@elseif، و ‎@else، و ‎@endif. هذه التعليمات تعمل تمامًا مثل نظيراتها في PHP.
@if (count($records) === 1)
    I have one record!
@elseif (count($records) > 1)
@elseif (count($records) > 1)
    I have multiple records!
 
  I have multiple records!
 
@else
@else
    I don't have any records!
 
  I don't have any records!
 
@endif
@endif
يُوفِّر Blade الموجّه ‎@unless كوسيلة لتسهيل الاستخدام:
</syntaxhighlight>
 
يُوفِّر Blade الموجّه <code>‎@unless</code> كوسيلة لتسهيل الاستخدام:<syntaxhighlight lang="php">
@unless (Auth::check())
@unless (Auth::check())
    You are not signed in.
 
  You are not signed in.
 
@endunless
@endunless
إضافة للموجّهات الشَّرطية التي ذكرناها، يُوفّر Blade التعليمتين ‎@isset و‎@empty كاختصارين لنظيريهما من دوال PHP:
</syntaxhighlight>
 
إضافة للموجّهات الشَّرطية التي ذكرناها، يُوفّر Blade التعليمتين ‎<code>@isset</code> و<code>‎@empty</code> كاختصارين لنظيريهما من دوال PHP:
<syntaxhighlight lang="php">
@isset($records)
@isset($records)
  // $records is defined and is not null...
  // معرّف وذو قيمة $records
@endisset
@endisset


@empty($records)
@empty($records)
  // $records is "empty"...
// "empty" أصبح $records
@endempt
@endempt
تعليمات الاستيثاق
</syntaxhighlight>
تُستخدم التعليمات ‎@auth و ‎@guest للتحقّق بسرعة من إذا ما كان المستخدم مسجلًا الدخول أو كان زائرًا:
 
=== تعليمات الاستيثاق ===
تُستخدم التعليمات ‎<code>@auth</code> و ‎<code>@guest</code> للتحقّق بسرعة من إذا ما كان المستخدم مسجلًا الدخول أو كان زائرًا:<syntaxhighlight lang="php">
@auth
@auth
  // The user is authenticated...
 
  // ...هذا المستخدم مسجّل الدخول
@endauth
@endauth


@guest
@guest
  // The user is not authenticated...
 
  // ...هذا المستخدم غير مسجّل الدخول
@endguest
@endguest
إذا لزم الأمر، يمكن استخدام حارس الاستيثاق (authentication guard) والذي يجب التحقق منه عند استعمال إحدى التعليمتين ‎@auth أو ‎@guest:
</syntaxhighlight>
 
إذا لزم الأمر، يمكن استخدام حارس الاستيثاق (authentication guard) والذي يجب التحقق منه عند استعمال إحدى التعليمتين ‎<code>@auth</code> أو ‎<code>@guest</code>:
<syntaxhighlight lang="php">
@auth('admin')
@auth('admin')
  // The user is authenticated...
 
  // ...هذا المستخدم مسجّل الدخول
 
@endauth
@endauth


@guest('admin')
@guest('admin')
  // The user is not authenticated...
 
  // ...هذا المستخدم غير مسجّل الدخول
 
@endguest
@endguest
تعليمات الأقسام
</syntaxhighlight>
يمكن التحقّق إذا كان القسم به محتوى أم لا باستخدام التعليمة ‎@hassection:
 
=== تعليمات الأقسام ===
يمكن التحقّق إذا كان القسم به محتوى أم لا باستخدام التعليمة ‎<code>@hassection</code>:
<syntaxhighlight lang="php">
@hasSection('navigation')
@hasSection('navigation')
     <div class="pull-right">
     <div class="pull-right">
سطر 214: سطر 269:
     <div class="clearfix"></div>
     <div class="clearfix"></div>
@endif
@endif
العبارة switch
</syntaxhighlight>
تُصاغ البنية switch باستخدام الموجّهات ‎@switch، و ‎@case، و ‎@break، و ‎@default، و ‎@endswitch:
 
=== العبارة switch ===
تُصاغ البنية <code>switch</code> باستخدام الموجّهات ‎<code>@switch</code>، و ‎<code>@case</code>، و ‎<code>@break</code>، و ‎<code>@default</code>، و ‎<code>@endswitch</code>:
 
<syntaxhighlight lang="php">
@switch($i)
@switch($i)
    @case(1)
  @case(1)
        First case...
      First case...
        @break
      @break
  @case(2)
      Second case...
      @break
  @default
      Default case...


    @case(2)
@endswitch
        Second case...
</syntaxhighlight>
        @break


    @default
=== الحلْقات ===
        Default case...
بالإضافة للعبارات الشَّرطية، يوفِّر Blade تعليمات بسيطة للعمل مع بنى PHP الحلقيّة. تعمل هذه التعليمات بطريقة مشابهة لنظيرتها في PHP:<syntaxhighlight lang="php">
@endswitch
الحَلْقات
بالإضافة للعبارات الشَّرطية، يوفِّر Blade تعليمات بسيطة للعمل مع بنى PHP الحلقيّة. تعمل هذه التعليمات بطريقة مشابهة لنظيرتها في PHP:
@for ($i = 0; $i < 10; $i++)
@for ($i = 0; $i < 10; $i++)
     The current value is {{ $i }}
     The current value is {{ $i }}
سطر 247: سطر 307:
     <p>I'm looping forever.</p>
     <p>I'm looping forever.</p>
@endwhile
@endwhile
</syntaxhighlight>
ملاحظة: عند استخدام البنى الحلقية، يمكن استخدام المتغيّرات الحلقية لكسب معلومات مهمة عن الحلقات، كمعلومات عن عدد التكرار في الحلقة.
ملاحظة: عند استخدام البنى الحلقية، يمكن استخدام المتغيّرات الحلقية لكسب معلومات مهمة عن الحلقات، كمعلومات عن عدد التكرار في الحلقة.


عند استخدام الحلقات يمكن إنهاء الحلقة أو تجاوز التكرار الجاري:
عند استخدام الحلقات يمكن إنهاء الحلقة أو تجاوز التكرار الجاري:
<syntaxhighlight lang="php">
@foreach ($users as $user)
@foreach ($users as $user)
    @if ($user->type == 1)
        @continue
    @endif


    <li>{{ $user->name }}</li>
  @if ($user->type == 1)
      @continue
  @endif
{{$user->name }}
  @if ($user->number == 5)
      @break
  @endif


    @if ($user->number == 5)
        @break
    @endif
@endforeach
@endforeach
</syntaxhighlight>
يمكن إضافة عبارة شرطية مع التعليمة في نفس السطر:
يمكن إضافة عبارة شرطية مع التعليمة في نفس السطر:
<syntaxhighlight lang="php">
@foreach ($users as $user)
@foreach ($users as $user)
    @continue($user->type == 1)


  @continue($user->type == 1)
     <li>{{ $user->name }}</li>
     <li>{{ $user->name }}</li>
  @break($user->number == 5)


    @break($user->number == 5)
@endforeach
@endforeach
المتغيّر loop
</syntaxhighlight>
عند استخدام العبارات الحلقية، يُنشَأ المتغيّر ‎$loop ويكون جاهزًا للاستخدام. يوفّر هذا المتغيّر عدّة معلومات مفيدة مثل إن كان التكرار الحالي الأول أو الأخير في الحلقة:
 
=== المتغيّر loop ===
عند استخدام العبارات الحلقية، يُنشَأ المتغيّر ‎<code>$loop</code> ويكون جاهزًا للاستخدام. يوفّر هذا المتغيّر عدّة معلومات مفيدة مثل إن كان التكرار الحالي الأول أو الأخير في الحلقة:
<syntaxhighlight lang="php">
@foreach ($users as $user)
@foreach ($users as $user)
    @if ($loop->first)
        This is the first iteration.
    @endif


    @if ($loop->last)
  @if ($loop->first)
        This is the last iteration.
      This is the first iteration.
    @endif
  @endif
  @if ($loop->last)
      This is the last iteration.
  @endif
 
This is user {{$user->id }}


    <p>This is user {{ $user->id }}</p>
@endforeach
@endforeach
عندما تكون في حلقات متداخلة كليًا، يمكن الولوج للمتغيّر ‎$loop الخاصّ بالحلقة الأم أو الحلقة الخارجية باستخدام الخاصّية parent:
</syntaxhighlight>
 
عندما تكون في حلقات متداخلة كليًا، يمكن الولوج للمتغيّر ‎<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)
  @foreach ($user->posts as $post)
            This is first iteration of the parent loop.
      @if ($loop->parent->first)
        @endif
          This is first iteration of the parent loop.
    @endforeach
      @endif
  @endforeach
 
@endforeach
@endforeach
المتغيّر ‎$loop يحتوي أيضًا على عدّة خاصيات أخرى مفيدة:
</syntaxhighlight>
 
المتغيّر <code>‎$loop</code> يحتوي أيضًا على عدّة خاصيات أخرى مفيدة:
 
{| class="wikitable"
!الخاصّية
!التعريف
|-
|<code>loop->index$</code>
|فهرس حلقة التكرار الحالية (يبدأ من 0).
|-
|<code>loop->iteration$</code>
|حلقة التكرار الحالية (تبدأ من 1).
|-
|<code>loop->remaining$</code>
|عدد حلقات التكرار المتبقية.
|-
|<code>loop->count$</code>
|العدد الكلّي للعناصر في مصفوفة المعلومات المكرّرة.
|-
|<code>loop->first$</code>
|إن كانت حلقة التكرار الحاليّة هي الأولى أم لا.
|-
|<code>loop->last$</code>
|إن كانت حلقة التكرار الحالية هي الأخيرة أم لا.
|-
|<code>loop->depth$</code>
|عمق التداخل في الحلقة الحالية.
|-
|<code>loop->parent$</code>
|في حالة الحلقات المتداخلة، المتغيّر ‎<code>$loop</code> للحلقة الأم.
|}
 
=== التعليقات ===
يسمح Blade بإضافة تعليقات في الواجهات. على عكس تعليقات [[HTML]]، فإن تعليقات Blade ليست مُضمّنة في شيفرة [[HTML]] الناتج من التطبيق:
<syntaxhighlight lang="php">
 
{{-- هذا التعليق لن يظهر في الصفحة النهائية HTML --}}


الخاصّية
</syntaxhighlight>
التعريف
 
$loop->index
=== PHP ===
فهرس حلقة التكرار الحالية (يبدأ من 0).
من المفيد في بعض الأحيان تضمين كود [[PHP]] في الواجهة. يمكن استخدام الموجّه <code>php@</code> لتنفيذ مقطع من كود [[PHP]] في القالب:
$loop->iteration
<syntaxhighlight lang="php">
حلقة التكرار الحالية (تبدأ من 1).
$loop->remaining
عدد حلقات التكرار المتبقية.
$loop->count
العدد الكلّي للعناصر في مصفوفة المعلومات المكرّرة.
$loop->first
إن كانت حلقة التكرار الحاليّة هي الأولى أم لا.
$loop->last
إن كانت حلقة التكرار الحالية هي الأخيرة أم لا.
$loop->depth
عمق التداخل في الحلقة الحالية.
$loop->parent
في حالة الحلقات المتداخلة، المتغيّر ‎$loop للحلقة الأم.
 
التعليقات
يسمح Blade بإضافة تعليقات في الواجهات. على عكس تعليقات HTML، فإن تعليقات Blade ليست مُضمّنة في شيفرة HTML الناتج من التطبيق:
{{-- This comment will not be present in the rendered HTML --}}
PHP
من المفيد في بعض الأحيان تضمين كود PHP في الواجهة. يمكن استخدام الموجّه php@ لتنفيذ مقطع من كود 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 Contents -->
         <!-- 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> في الواجهات لأنها تشير إلى أماكن وجود الواجهات المترجمة والمخزّنة مؤقتًا.


إظهار الواجهات في المجموعات  
=== إظهار الواجهات في المجموعات ===
بالإمكان دمج التضمين و الحلقات في سطر واحد باستخدام التعليمة @each:
بالإمكان دمج التضمين و الحلقات في سطر واحد باستخدام التعليمة <code>each@</code>:<syntaxhighlight lang="html">
@each('view.name', $jobs, 'job')
@each('view.name', $jobs, 'job')
المعامل الأول هو الواجهة الجزئية التي ستُظهَر لكل عنصر من المصفوفة أو المجموعة.
 
المعامل الثاني هو المجموعة أو المصفوفة التي ستُكرَّر بينما المعامل الثالث هو اسم المتغيّر التي سيخصّص لحلقة التكرار الحالية في الواجهة. فعلى سبيل المثال، إن كنت تقوم بالتكرار في مصفوفة أعمال jobs، عادة ستصل إلى كل عمل عن طريق متغيّر job في الواجهة الجزئية. يكون المفتاح لحلقة التكرار الحالية متاحا في المتغيّر key من الواجهة الجزئية.
</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')
ملاحظة: الواجهات المُظهَرة باستخدام التعليمة ‎@each ترث متغيّرات الواجهة الأم. إن كانت المتغيّرات إجباريةً في الواجهة اابن، فيجب استخدام الموجّه ‎@foreach و ‎@include بدًلا عن each@.


المكادس (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>
 
  <script src="/example.js"></script>
 
@endpush
@endpush
يمكنك الدفع إلى المكدس مرّات عديدة ثمّ لإظهار محتوى المكدس الكامل، يُمرَّر اسم المكدس كمعامل للتعليمة ‎@stack:
</syntaxhighlight>
 
يمكنك الدفع إلى المكدس مرّات عديدة ثمّ لإظهار محتوى المكدس الكامل، يُمرَّر اسم المكدس كمعامل للتعليمة ‎<code>@stack</code>:
<syntaxhighlight lang="html+php">
 
<head>
<head>
     <!-- Head Contents -->
     <!-- Head محتويات قسم -->


     @stack('scripts')
     @stack('scripts')
</head>
</head>
إذا أردت إضافة محتوى لبداية المكدس، يمكن استعمال التعليمة ‎@prepend:
</syntaxhighlight>
 
إذا أردت إضافة محتوى لبداية المكدس، يمكن استعمال التعليمة ‎<code>@prepend</code>:
<syntaxhighlight lang="php">
@push('scripts')
@push('scripts')
    This will be second...
 
  This will be second...
 
@endpush
@endpush


// Later...
// لاحقا
@prepend('scripts')
 
  This will be first...


@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')


سطر 375: سطر 498:
     Monthly Revenue: {{ $metrics->monthlyRevenue() }}.
     Monthly Revenue: {{ $metrics->monthlyRevenue() }}.
</div>
</div>
تمديد Blade
</syntaxhighlight>


يسمح Blade بتعريف تعليمات خاصّة باستعمال التابع directive. عندما يلاقي معالج Blade تعليمات خاصّة فإنّه سينجز دالة رد النداء (callback) بالتعبير الذي تحتويه التعليمة.
== تمديد Blade ==
سنُنشِئ في المثال التالي تعليمةً   ‎@datetime($var)‎ التي تقبل المعامل var$ كنسخة من الصنف DateTime:
يسمح Blade بتعريف تعليمات خاصّة باستعمال التابع <code>directive</code>. عندما يلاقي معالج Blade تعليمات خاصّة فإنّه سينجز دالة رد النداء (callback) بالتعبير الذي تحتويه التعليمة. سنُنشِئ في المثال التالي تعليمةً <code>@datetime($var)</code>‎ التي تقبل المعامل <code>var$</code> كنسخة من الصنف <code>DateTime</code>:
<syntaxhighlight lang="php">
<?php
<?php


سطر 389: سطر 513:
{
{
     /**
     /**
     * Perform post-registration booting of services.
     * .تحميل أوّلي لتسجيل الخدمات
     *
     *
     * @return void
     * @return void
سطر 401: سطر 525:


     /**
     /**
     * Register bindings in the container.
     * .تسجيل الارتباطات في الحاوية
     *
     *
     * @return void
     * @return void
سطر 410: سطر 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;


/**
/**
* Perform post-registration booting of services.
 
*
* .تحميل أوّلي لتسجيل الخدمات
* @return void
*
*/
* @return void
public function boot()
*/
{
 
    Blade::if('env', function ($environment) {
public function boot() {
        return app()->environment($environment);
 
    });
  Blade::if('env', function ($environment) {
      return app()->environment($environment);
  });
 
}
}
</syntaxhighlight>
بعد التعريف، يمكن استعمال الصيغة الشرطية المخصوصة بسهولة في باقي القالب:
بعد التعريف، يمكن استعمال الصيغة الشرطية المخصوصة بسهولة في باقي القالب:
<syntaxhighlight lang="html">
@env('local')
@env('local')
  // The application is in the local environment...
 
  // ...التطبيق في البيئة المحلية
@elseenv('testing')
@elseenv('testing')
  // The application is in the testing environment...
 
  // ...التطبيق في بيئةالاختبار
@else
@else
  // The application is not in the local or testing environment...
 
  // ...التطبيق ليس في البيئة المحلية وليس في بيئة الاختبار
@endenv
@endenv
</syntaxhighlight>


مصادر
== مصادر ==
صفحة Blade في توثيق Laravel الرسمي.
* [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

مصادر