بالطبع ، ليس من العملي إرجاع سلاسل مستندات HTML بالكامل مباشرةً من المسارات (paths) والمتحكمات الخاصة بك (controllers). لحسن الحظ ، توفر الواجهات طريقة مناسبة لوضع كل HTML في ملفات منفصلة. تفصل الواجهات منطق وحدة التحكم / منطق التطبيق عن منطق عرضك التقديمي (presentation logic) ويتم تخزين الواجهات في المجلد resources/view
. قد تشبه الواجهة البسيطة المثال التالي:
<!-- الواجهات المُخزّنة في resources/views/greeting.blade.php -->
<html>
<body>
<h1>Hello, {{ $name }}</h1>
</body>
</html>
نظراً لأن هذه الواجهة مخزنة في resources/views/greeting.blade.php
، يمكننا ارجاعها باستخدام المساعد العام view
مثل:
Route::get('/', function () {
return view('greeting', ['name' => 'James']);
});
ملاحظة: هل تبحث عن مزيد من المعلومات حول كيفية كتابة قوالب Blade؟ ألق نظرة على توثيق Blade الكامل للبدء.
يمكنك إنشاء واجهة عن طريق وضع ملف بامتداد .blade.php
في مجلد resources/views
في تطبيقك. يخبر الامتداد .blade.php
إطار العمل (framework) بأن الملف يحتوي على قالب Blade. تحتوي قوالب الBlade على HTML بالإضافة إلى مجلدات Blade التي تتيح لك محاكاة القيم بسهولة وإنشاء عبارات "if" والتكرار على البيانات والمزيد.
بمجرد إنشاء واجهة ، يمكنك إرجاعها من أحد مسارات أو متحكمات في تطبيقك باستخدام المساعد العام view
:
Route::get('/', function () {
return view('greeting', ['name' => 'James']);
});
يمكن أيضاً إرجاع الواجهة عبر الواجهة الساكنة `View`:
use Illuminate\Support\Facades\View;
return View::make('greeting', ['name' => 'James']);
كما ترى، يُوافق المّتغيّر الوسيط الأوّل المُمرّر إلى المُساعد view اسم ملف الواجهة في المجلّد resources/views. المتغيّر الوسيط الثاني هو مصفوفة البيانات التي يجب أن تُتاح للواجهة. نقوم في هذه الحالة بتمرير المتغيّر name الذي يُعرض في الواجهة باستخدام صيغة Blade.
يمكن أيضاً تضمين (nesting) الواجهات ضمن مُجلّدات فرعية من المُجلّد resources/views
. يمكن استخدام الترميز "نقطة" للإشارة للعروض المتداخلة (nested). مثلا، إن خُزّن عرضك في resources/views/admin/profile.blade.php
، يمكن ارجاعه من أحد مسارات/ متحكمات تطبيقك على النحو التالي:
return view('admin.profile', $data);
ملاحظة: يجب ألا تحتوي مجلدات الواجهة على نقطة
.
يمكنك إنشاء الواجهة
الأولى في مصفوفة معيّنة من الواجهات باستخدام التابع first
. يُفيدك هذا إن سمح تطبيقك أو حزمتك بتخصيص الواجهات أو إعادة تعريفها (overwritten):
use Illuminate\Support\Facades\View;
return View::first(['custom.admin', 'admin'], $data);
إن كنت بحاجة لتحديد إن كانت الواجهة موجودة، يمكنك استخدام الواجهة الساكنة View (أي View
facade). سيرد التابع exists
بالقيمة true إن وُجدت الواجهة:
use Illuminate\Support\Facades\View;
if (View::exists('emails.customer')) {
//
}
كما رأيت في الأمثلة السابقة، يمكنك تمرير مصفوفة من البيانات للواجهات لجعل تلك البيانات متوفرة للواجهة:
return view('greetings', ['name' => 'Victoria']);
عند تمرير المعلومات بهذه الطريقة ، يجب أن تكون البيانات مصفوفة من الأزواج مفتاح / قيمة (key/value). بعد تمرير البيانات للواجهة
يمكنك الوصول لكل قيمة باستخدام مفتاحها المُوافق داخل واجهتك، مثل <?;php echo $key ?>
. كبديل لتمرير مصفوفة كاملة من البيانات إلى دالّة المُساعد view،
يمكنك استخدام التابع with
لإضافة أجزاء منفردة من البيانات للواجهة. يرجع التابع with
نسخة من كائن الواجهة (view object) بحيث يمكنك متابعة تسلسل التوابع قبل إرجاع الواجهة:
return view('greeting')
->with('name', 'Victoria')
->with('occupation', 'Astronaut');
في بعض الأحيان ، قد تحتاج إلى مشاركة البيانات مع جميع واجهات تطبيقك.
يمكنك استخدام التابع share
من واجهة العرض الساكنة (view facade) للقيام بذلك. عادة، عليك وضع نداءات التابع share
داخل تابع مقدّم الخدمات boot
. لك حريّة إضافتها إلى App\Providers\AppServiceProvider class
أو إنشاء مُقدّم خدمة منفصل لإيوائها:
<?php
namespace App\Providers;
use Illuminate\Support\Facades\View;
class AppServiceProvider extends ServiceProvider
{
/**
* تسجيل أي خدمة تطبيق
*
* @return void
*/
public function register()
{
//
}
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
View::share('key', 'value');
}
}
مُؤلّفو الواجهات هم عمليات نداء (callbacks) أو دوال أصناف (class methods) تُستدعى عند عرض الواجهة. إذا كانت لديك بيانات تريد ربطها بواجهة في كل مرة يتم فيها عرض هذا الواجهة ، فيمكن أن يساعدك مؤلف الواجهة في تنظيم هذا المنطق في مكان واحد. قد يكون مؤلفو الواجهة ذو فائدة بشكل خاص إذا تم إرجاع نفس الواجهة من خلال مسارات أو متحكمات متعددة داخل تطبيقك وتحتاج دائماً إلى جزء معين من البيانات.
عادةً ، سيتم تسجيل مؤلفي الواجهات في أحد مزودي الخدمة لتطبيقك. في هذا المثال ، سنفترض أننا أنشأنا App\Providers\ViewServiceProvider
جديدًا لإيواء هذا المنطق.
سنستخدم التابع composer
للواجهة الساكنة View لتسجيل مؤلف الواجهة تذكر أن Laravel لا يحتوي على مجلّد افتراضي لمؤلّفي الواجهات المعتمدة على الأصناف (class based). لديك حريّة تنظيمها كما شئت. على سبيل المثال ، يمكنك إنشاء دليل app/View/Composers
لإيواء جميع مؤلفي واجهات تطبيقك:
<?php
namespace App\Providers;
use App\View\Composers\ProfileComposer;
use Illuminate\Support\Facades\View;
use Illuminate\Support\ServiceProvider;
class ViewServiceProvider extends ServiceProvider
{
/**
* تسجيل أي خدمات تطبيق.
*
* @return void
*/
public function register()
{
//
}
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
// استخدام المؤلّفين على أساس الصنف ...
View::composer('profile', ProfileComposer::class);
// Closure استخدام المؤلّفين على أساس
View::composer('dashboard', function ($view) {
//
});
}
}
ملاحظة: تذكر أنه إن أنشأت مقدّم خدمات جديد لاحتواء تسجيلات مؤلف واجهاتك ستحتاج لإضافة مُقدّم الخدمات إلى مصفوفة
providers
في ملف الإعداداتconfig/app.php.
.
بعد تسجيلنا للمؤلّف سيُنفّذ الآن سينفذ التابع compose
من الصنف App\View\Composers\ProfileComposer
في كل مرة يتم عرض واجهة profile
. لذا فلنتعرف على صنف المؤلف:
<?php
namespace App\View\Composers;
use App\Repositories\UserRepository;
use Illuminate\View\View;
class ProfileComposer
{
/**
* The user repository implementation.
*
* @var \App\Repositories\UserRepository
*/
protected $users;
/**
* profile أنشئ مؤلّف جديد من
*
* @param \App\Repositories\UserRepository $users
* @return void
*/
public function __construct(UserRepository $users)
{
// Dependencies are automatically resolved by the service container...
$this->users = $users;
}
/**
* إربط البيانات بالواجهة
*
* @param \Illuminate\View\View $view
* @return void
*/
public function compose(View $view)
{
$view->with('count', $this->users->count());
}
}
كما ترى، يُستبين كل مؤلّفو الواجهة عبر حاوي الخدمات، لذا تستطيع التلميح على نوع أي إعتماديّة تحتاجها داخل تابع بناء المؤلّف (composer's constructor).
يمكنك إرفاق أحد مؤلّفي الواجهة بعدة واجهات مرّة واحدة بتمرير مصفوفة من الواجهات كالمُتغيّر الوسيط الأوّل للتابع composer
:
use App\Views\Composers\MultiComposer;
View::composer(
['profile', 'dashboard'],
MultiComposer::class
);
يقبل التابع composer
أيضاً الحرف *
كحرف بدل خاص (wildcard)، مما يتيح لك إرفاق مُؤلّف لكل الواجهات:
View::composer('*', function ($view) {
//
});
يشبه مُنشؤو الواجهات مؤلّفي الواجهات جداً؛ مع فارق أنّها تُنفّذ مباشرة بعد إنشاء نسخة (instantiating) الواجهة بدلاً من الانتظار حتى ينتهي عرضه. لتسجيل منشئ واجهة استخدم التابع creator
:
use App\View\Creators\ProfileCreator;
use Illuminate\Support\Facades\View;
View::creator('profile', ProfileCreator::class);
بشكل افتراضي ، يتم ترجمة واجهات قالب Blade عند الطلب. عندما يتم تنفيذ طلب الذي يعرض واجهة ، سيحدد Laravel ما إذا كانت هناك نسخة مترجمة موجودة من الواجهة. إذا كان الملف موجوداً ، فسيحدد Laravel بعد ذلك ما إذا كان الواجهة الغير مترجمة قد تم تعديلها مؤخراً عن الواجهة المترجمة. إذا كانت الواجهة المترجمة إما غير موجود ، أو تم تعديل الواجهة الغير مترجمة ، فسيعيد Laravel ترجمة الواجهة.
قد يكون ترجمة الواجهات أثناء الطلب تأثير سلبي بسيط على الأداء ، لذلك يوفر Laravel أمر view: cache
Artisan لإجراء ترجمة مسبقة لجميع الواجهات التي يستخدمها تطبيقك. لزيادة الأداء ، قد ترغب في تشغيل هذا الأمر كجزء من عملية النشر الخاصة بك:
php artisan view:cache
يمكنك استخدام الأمر view: clear
لمسح ذاكرة التخزين المؤقت للواجهة:
php artisan view:clear