الواجهات (Views) في Laravel

من موسوعة حسوب
اذهب إلى: تصفح، ابحث

إنشاء الواجهات

ملاحظة: هل تبحث عن مزيد من المعلومات حول كيفية كتابة قوالب Blade؟ ألق نظرة على توثيق Blade الكامل للبدء.

تحتوي الواجهات على HTML الذي يُقدّمه تطبيقك وتفصل منطق وحدة التحكّم/منطق التطبيق من منطق عرضك التقديمي (presentation logic). تُخزّن الواجهات في المُجلّد resources/views. قد تشبه الواجهة البسيطة المثال التالي:
<! - الواجهات مُخزّنة في resources/views/greeting.blade.php ->

<html>
    <body>
        <h1>Hello, {{ $name }}</h1>
    </body>
</html>
كما ترى، يُوافق المّتغيّر الوسيط الأوّل المُمرّر إلى المُساعد view اسم ملف الواجهة في المجلّد resources/views. المتغيّر الوسيط الثاني هو مصفوفة البيانات التي يجب أن تُتاح للواجهة. نقوم في هذه الحالة بتمرير المتغيّر name الذي يُعرض في الواجهة باستخدام صيغة Blade. يمكن أيضًا تضمين (nesting)الواجهات ضمن مُجلّدات فرعية من المُجلّد resources/views. يمكن استخدام الترميز "نقطة" للإشارة للعروض المتداخلة (nested). مثلا، إن خُزّن عرضك في resources/views/admin/profile.blade.php، يمكنك الإشارة إليه (reference it) على النحو التالي:
return view('admin.profile', $data);

تحديد إن كانت الواجهة موجودة

إن كنت بحاجة لتحديد إن كانت الواجهة موجودة، يمكنك استخدام الواجهة الساكنة View (أي View facade). سيرد التابع exists بالقيمة true إن وُجدت الواجهة:
use Illuminate\Support\Facades\View;

if (View::exists('emails.customer')) {
   //
}

إنشاء أوّل واجهة متاحة

يمكنك إنشاء الواجهة الأولى في مصفوفة معيّنة من الواجهات باستخدام التابع first. يُفيدك هذا إن سمح تطبيقك أو حزمتك بتخصيص الواجهات أو إعادة تعريفها (overwriting):
return view()->first(['custom.admin', 'admin'], $data);
يمكنك أيضا مناداة هذا التابع عبر الواجهة الساكنة View:
use Illuminate\Support\Facades\View;

return View::first(['custom.admin', 'admin'], $data);

تمرير البيانات للواجهات

كما رأيت في الأمثلة السابقة، يمكنك تمرير مصفوفة من البيانات للواجهات:
return view('greetings', ['name' => 'Victoria']);
عند تمرير المعلومات بهذه الطريقة ، يجب أن تكون البيانات مصفوفة من الأزواج مفتاح / قيمة. يمكنك الوصول لكل قيمة باستخدام مفتاحها المُوافق داخل واجهتك، مثل <?;php echo $key ?>. كبديل لتمرير مصفوفة كاملة من البيانات إلى دالّة المُساعد view، يمكنك استخدام التابع with لإضافة أجزاء منفردة من البيانات للواجهة:
return view('greeting')->with('name', 'Victoria');

مشاركة البيانات مع جميع الواجهات

قد تحتاج من حين لآخر إلى مشاركة جزء من البيانات مع جميع الواجهات

التي يصيّرها تطبيقك. يمكنك استخدام التابع share من واجهة العرض الساكنة (view facade) للقيام بذلك. عادة، عليك وضع نداءات المشاركة داخل تابع مقدّم الخدمات boot. لك حريّة إضافتها إلى AppServiceProvider أو إنشاء مُقدّم خدمة منفصل لإيوائها:
<?php

namespace App\Providers;

use Illuminate\Support\Facades\View;

class AppServiceProvider extends ServiceProvider
{
    /**
     * تمهيد أي خدمة تطبيق
     *
     * @return void
     */
    public function boot()
    {
        View::share('key', 'value');
    }

    /**
     * سجّل موفّر الخدمة
     *
     * @return void
     */
    public function register()
    {
       //
    }
}

مؤلّفو الواجهات (View Composers)

مُؤلّفو الواجهات هم ردود نداء أو دوال أصناف تُستدعى عند تصيير الواجهة. يستطيع مؤلفو الواجهة أن يساعدوك إن كانت لديك بيانات ترغب في ربطها بواجهة ما في كل مرة يُصيّر فيها في تنظيم المنطق اللازم في موضع واحد.

في هذا المثال، فلنسجِّل مؤلفي الواجهة في مقدّم خدمات. سنستخدم الواجهة الساكنة View  للوصول لتعريف استخدام العقد Illuminate\Contracts\View\Factory الأساسي. تذكر أن Laravel لا يحتوي على مجلّد افتراضي لمؤلّفي الواجهات. لديك حريّة تنظيمها كما شئت. يمكنك على سبيل المثال إنشاء مجلّد app/Http/ViewComposers:
<?php

namespace App\Providers;

use Illuminate\Support\Facades\View;
use Illuminate\Support\ServiceProvider;

class ComposerServiceProvider extends ServiceProvider
{
    /**
     * تسجيل الارتباطات في الحاوي.
     *
     * @return void
     */
    public function boot()
    {
       // استخدام المؤلّفين على أساس الصنف ...
        View::composer(
            'profile', 'App\Http\ViewComposers\ProfileComposer'
        );

       // Closure استخدام المؤلّفين على أساس 
        View::composer('dashboard', function ($view) {
           //
        });
    }

    /**
     * تسجيل مقدم الخدمة.
     *
     * @return void
     */
    public function register()
    {
       //
    }
}
تنبيه: تذكر أنه إن أنشأت مقدّم خدمات جديد لاحتواء تسجيلات مؤلف واجهاتك ستحتاج لإضافة مُقدّم الخدمات إلى مصفوفة providers في ملف الإعدادات config/app.php. بعد تسجيلنا للمؤلّف سيُنفّذ الآن التابع ProfileComposer@compose كل مرة تُصيّر فيها الواجهة profile. لذا فنُعرّف صنف المُؤلّف:
<?php

namespace App\Http\ViewComposers;

use Illuminate\View\View;
use App\Repositories\UserRepository;

class ProfileComposer
{
    /**
     * تعريف استخدام مستودع المستخدم.
     *
     * @var UserRepository
     */
    protected $users;

    /**
     * profile أنشئ مؤلّف جديد من
     *
     * @param  UserRepository  $users
     * @return void
     */
    public function __construct(UserRepository $users)
    {
       // Dependencies automatically resolved by service container...
        $this->users = $users;
    }

    /**
     * إربط البيانات بالواجهة
     *
     * @param  View  $view
     * @return void
     */
    public function compose(View $view)
    {
        $view->with('count', $this->users->count());
    }
}
يُستدعى تابع المُؤلّف compose قبل تصيير الواجهة بالظبط مع النسخة Illuminate\View\View. يمكنك استخدام التابع with لربط البيانات بالواجهة.

ملاحظة: يُستبين كل مؤلّفو الواجهة عبر حاوي الخدمات، لذا تستطيع التلميح على نوع أي إعتماديّة تحتاجها داخل تابع بناء المؤلّف.

إرفاق المُؤلّف مع عدّة واجهات

يمكنك إرفاق أحد مؤلّفي الواجهة بعدة واجهات مرّة واحدة بتمرير مصفوفة من الواجهات كالمُتغيّر الوسيط الأوّل للتابع composer:
View::composer(
    ['profile', 'dashboard'],
    'App\Http\ViewComposers\MyViewComposer'
);
يقبل التابع composer أيضًا الحرف * كحرف بدل خاص (wildcard)، مما يتيح لك إرفاق مُؤلّف بكل الواجهات:
View::composer(
    ['profile', 'dashboard'],
    'App\Http\ViewComposers\MyViewComposer'
);

مُنشؤو الواجهات (View creators)

يشبه مُنشؤو الواجهات مؤلّفي الواجهات جدًا؛ مع فارق أنّها تُنفّذ مباشرة بعد إنشاء نسخة (instantiating) الواجهة بدلاً من الانتظار حتى ينتهي تصييره. لتسجيل منشئ واجهة استخدم التابع creator:
View::creator('profile', 'App\Http\ViewCreators\ProfileCreator');

مصادر